Add support for PHP's timezone characters
This commit is contained in:
parent
9a68dbd9d1
commit
16867ce9d2
1 changed files with 68 additions and 18 deletions
|
@ -70,7 +70,66 @@ to_string(FormatKey, ToTZ, Date) when is_atom(FormatKey) orelse is_tuple(FormatK
|
||||||
to_string(Format, ToTZ, Date) when is_binary(Format) ->
|
to_string(Format, ToTZ, Date) when is_binary(Format) ->
|
||||||
list_to_binary(to_string(binary_to_list(Format), ToTZ, Date));
|
list_to_binary(to_string(binary_to_list(Format), ToTZ, Date));
|
||||||
to_string(Format, ToTZ, Date) when is_list(Format) ->
|
to_string(Format, ToTZ, Date) when is_list(Format) ->
|
||||||
ec_date:format(Format,to_date(Date,ToTZ)).
|
to_string_worker(Format, ToTZ, to_date(Date,ToTZ)).
|
||||||
|
|
||||||
|
to_string_worker([], _, _) ->
|
||||||
|
"";
|
||||||
|
to_string_worker([$e|RestFormat], ToTZ, Date) ->
|
||||||
|
ToTZ ++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([$I|RestFormat], ToTZ, Date) ->
|
||||||
|
I = case localtime_dst:check(Date, ToTZ) of
|
||||||
|
is_in_dst -> "1";
|
||||||
|
is_not_in_dst -> "0";
|
||||||
|
ambiguous_time -> "?"
|
||||||
|
end,
|
||||||
|
I ++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([H | RestFormat], ToTZ, Date) when H==$O orelse H==$P ->
|
||||||
|
Shift = get_timezone_shift(Date, ToTZ),
|
||||||
|
Separator = case H of
|
||||||
|
$O -> "";
|
||||||
|
$P -> ":"
|
||||||
|
end,
|
||||||
|
format_shift(Shift,Separator) ++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([$T | RestFormat], ToTZ, Date) ->
|
||||||
|
{ShortName,_} = localtime:tz_name(Date, ToTZ),
|
||||||
|
ShortName ++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([$Z | RestFormat], ToTZ, Date) ->
|
||||||
|
{Sign, Hours, Mins} = get_timezone_shift(Date, ToTZ),
|
||||||
|
Seconds = (Hours * 3600) + (Mins * 60),
|
||||||
|
atom_to_list(Sign) ++ integer_to_list(Seconds) ++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([$r | RestFormat], ToTZ, Date) ->
|
||||||
|
NewFormat = "D, d M Y H:i:s O",
|
||||||
|
to_string_worker(NewFormat, ToTZ, Date) ++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([$c | RestFormat], ToTZ, Date) ->
|
||||||
|
Format1 = "Y-m-d",
|
||||||
|
Format2 = "H:i:sP",
|
||||||
|
to_string_worker(Format1, ToTZ, Date)
|
||||||
|
++ "T"
|
||||||
|
++ to_string_worker(Format2, ToTZ, Date)
|
||||||
|
++ to_string_worker(RestFormat, ToTZ, Date);
|
||||||
|
to_string_worker([H | RestFormat], ToTZ, Date) ->
|
||||||
|
ec_date:format([H], Date) ++ to_string_worker(RestFormat, ToTZ, Date).
|
||||||
|
|
||||||
|
|
||||||
|
format_shift({Sign,Hours,Mins},Separator) ->
|
||||||
|
SignStr = atom_to_list(Sign),
|
||||||
|
MinStr = leading_zero(Mins),
|
||||||
|
HourStr = leading_zero(Hours),
|
||||||
|
SignStr ++ HourStr ++ Separator ++ MinStr.
|
||||||
|
|
||||||
|
leading_zero(I) when I < 10 ->
|
||||||
|
"0" ++ integer_to_list(I);
|
||||||
|
leading_zero(I) ->
|
||||||
|
integer_to_list(I).
|
||||||
|
|
||||||
|
get_timezone_shift(Date, TZ) ->
|
||||||
|
case localtime:tz_shift(Date, TZ) of
|
||||||
|
unable_to_detect -> {error,unable_to_detect};
|
||||||
|
{error,T} -> {error,T};
|
||||||
|
{Sh, _DstSh} -> Sh;
|
||||||
|
Sh -> Sh
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
format(Format) ->
|
format(Format) ->
|
||||||
to_string(Format).
|
to_string(Format).
|
||||||
|
@ -241,17 +300,6 @@ floor(N) when N < 0 ->
|
||||||
true -> Int-1
|
true -> Int-1
|
||||||
end.
|
end.
|
||||||
|
|
||||||
tz_formatting(Date,Format,TZ) ->
|
|
||||||
%% e, I, O, P, and T, Z
|
|
||||||
%% e = "UTC, GMT, Atlantic,/Azores"
|
|
||||||
%% I = Daylight Saving on = 1, off = 0
|
|
||||||
%% O = GMT diff in hours: +0200
|
|
||||||
%% P = GMT diff in hours with color: +02:00
|
|
||||||
%% T = TZ abbreviation: EST, MDT
|
|
||||||
%% Z = TZ offset in seconds: -43200 - 50400
|
|
||||||
not_implemented.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%% TESTS
|
%% TESTS
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
@ -263,8 +311,6 @@ tz_formatting(Date,Format,TZ) ->
|
||||||
-define(SITE_KEY,test_site_key).
|
-define(SITE_KEY,test_site_key).
|
||||||
-define(USER_KEY,test_user_key).
|
-define(USER_KEY,test_user_key).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
tz_test_() ->
|
tz_test_() ->
|
||||||
{
|
{
|
||||||
setup,
|
setup,
|
||||||
|
@ -288,7 +334,14 @@ tz_tests(_) ->
|
||||||
?_assertEqual(?SITE_TZ,get_timezone(?SITE_KEY)),
|
?_assertEqual(?SITE_TZ,get_timezone(?SITE_KEY)),
|
||||||
?_assertEqual({{2013,3,7},{0,0,0}}, to_date("3/7/2013 1:00am EST",?USER_KEY)),
|
?_assertEqual({{2013,3,7},{0,0,0}}, to_date("3/7/2013 1:00am EST",?USER_KEY)),
|
||||||
?_assertEqual({{2013,3,7},{0,0,0}}, to_date("3/7/2013 3:00am EST",?SITE_KEY)),
|
?_assertEqual({{2013,3,7},{0,0,0}}, to_date("3/7/2013 3:00am EST",?SITE_KEY)),
|
||||||
?_assertEqual({{2013,3,7},{2,0,0}}, to_date("3/7/2013 1:00am CST")) %% will use the current pid's setting
|
?_assertEqual({{2013,3,7},{2,0,0}}, to_date("3/7/2013 1:00am CST")), %% will use the current pid's setting
|
||||||
|
?_assertEqual("America/Chicago",to_string("e","America/Chicago","3/7/2013 1:00am")),
|
||||||
|
?_assertEqual("-0500",to_string("O","EST","3/7/2013 1:00am CST")),
|
||||||
|
?_assertEqual("-05:00",to_string("P","EST","3/7/2013 1:00am CST")),
|
||||||
|
?_assertEqual("EST",to_string("T","America/New York","3/7/2013 1:00am CST")),
|
||||||
|
?_assertEqual(integer_to_list(-5 * 3600), to_string("Z","EST","3/7/2013 1:00am CST")),
|
||||||
|
?_assertEqual("Thu, 07 Mar 2013 13:15:00 -0500", to_string("r","EST", "3/7/2013 1:15:00pm")),
|
||||||
|
?_assertEqual("2013-03-07T13:15:00-05:00", to_string("c", "EST", "3/7/2013 1:15:00pm"))
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
simple_test(_) ->
|
simple_test(_) ->
|
||||||
|
@ -307,9 +360,6 @@ simple_test(_) ->
|
||||||
?_assertEqual({{2013,1,1},{0,15,15}},to_date("December 31, 2012 6:15:15pm CST","GMT"))
|
?_assertEqual({{2013,1,1},{0,15,15}},to_date("December 31, 2012 6:15:15pm CST","GMT"))
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
%%tz_char_tests(_) ->
|
|
||||||
%% qdate:set_timezone(?SELF_TZ),
|
|
||||||
|
|
||||||
parser_format_test(_) ->
|
parser_format_test(_) ->
|
||||||
{inorder,[
|
{inorder,[
|
||||||
?_assertEqual({{2008,2,8},{0,0,0}},to_date("20080208")),
|
?_assertEqual({{2008,2,8},{0,0,0}},to_date("20080208")),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue