%%------------------------------------------------------------------------------
%% Licensed to the Apache Software Foundation (ASF) under one or more
%% contributor license agreements.  See the NOTICE file distributed with
%% this work for additional information regarding copyright ownership.
%% The ASF licenses this file to You under the Apache License, Version 2.0
%% (the "License"); you may not use this file except in compliance with
%% the License.  You may obtain a copy of the License at
%%
%%     http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%------------------------------------------------------------------------------
-module(dubbo_time_util).

-include_lib("kernel/include/file.hrl").


-export([
    get_cur_time/0, get_cur_time/1,
    format_time_to_str/1,
    timestamp/0, timestamp_ms/0,
    timestamp_to_datetime/1,
    timestamp_to_local_datetime/1,
    get_cur_date/0,
    datetime_to_timestamp/1]).


get_cur_time() ->
    {{Year, Month, Day}, {Hour, Min, Second}} = calendar:now_to_local_time(os:timestamp()),
    io_lib:format("~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", [Year, Month, Day, Hour, Min, Second]).

get_cur_date() ->
    {{Year, Month, Day}, {Hour, Min, Second}} = calendar:now_to_local_time(os:timestamp()),
    io_lib:format("~4..0w-~2..0w-~2..0w", [Year, Month, Day]).

get_cur_time({{Year, Month, Day}, {Hour, Min, Second}}) ->
    io_lib:format("~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", [Year, Month, Day, Hour, Min, Second]).

format_time_to_str({{Year, Month, Day}, {Hour, Min, Second}}) ->
    io_lib:format("~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", [Year, Month, Day, Hour, Min, Second]).

timestamp() ->
    {M, S, _} = os:timestamp(),
    M * 1000000 + S.
timestamp_ms() ->
    {M, S, W} = os:timestamp(),
    M * 1000000000 + S * 1000 + (W div 1000).

timestamp_to_datetime(Timestamp) ->
    calendar:gregorian_seconds_to_datetime(Timestamp +
        calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}})).
timestamp_to_local_datetime(Timestamp) ->
    Date = calendar:gregorian_seconds_to_datetime(Timestamp +
        calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}})),
    calendar:universal_time_to_local_time(Date).

datetime_to_timestamp(Date) ->
    [{D, T}] = calendar:local_time_to_universal_time_dst(Date),
    S = calendar:datetime_to_gregorian_seconds({D, T}),
    S1 = calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}}),
    (S - S1).
