Date 如何在yyy-MM-dd';T';HH:mm:ss.SSSZ格式

Date 如何在yyy-MM-dd';T';HH:mm:ss.SSSZ格式,date,erlang,Date,Erlang,我想获取当前时间,并按以下方式格式化: yyyy-MM-dd'HH:MM:ss.SSSZ (其中SSS为毫秒,Z为时区) 到目前为止,我的代码如下: formatted_date() -> {{Y,M,D},{H,Min,S}} = erlang:localtime(), {Ms, _, _} = os:timestamp(), {Days, {Hours, _,_}} = calendar:time_difference(erlang:universaltime(), erl

我想获取当前时间,并按以下方式格式化:

yyyy-MM-dd'HH:MM:ss.SSSZ

(其中SSS为毫秒,Z为时区)

到目前为止,我的代码如下:

formatted_date() ->
  {{Y,M,D},{H,Min,S}} = erlang:localtime(),
  {Ms, _, _} = os:timestamp(),
  {Days, {Hours, _,_}} = calendar:time_difference(erlang:universaltime(), erlang:localtime()),
  Difference = 24*Days + Hours,
  Tz = [case Difference < 0 of
          true ->
            $-;
          false ->
            $+
        end | io_lib:format("~2..0B00",[Difference])],
  io_lib:format("[~4..0B-~2..0B-~2..0BT~2..0B:~2..0B:~2..0B.~3..0B ~5.s]",
                              [Y, M, D, H, Min, S, Ms, Tz]).
格式化日期()->
{{Y,M,D},{H,Min,S}}=erlang:localtime(),
{Ms,{,}=os:timestamp(),
{Days,{Hours,{,{}}=日历:时差(erlang:universaltime(),erlang:localtime()),
差异=24*天+小时,
Tz=[案例差异<0
正确->
$-;
错误->
$+
end | io_lib:format(“~2..0B00”,[Difference]),
io_lib:format(“[~4..0B-~2..0B-~2..0BT~2..0B:~2..0B:~2..0B.~3..0B~5.s]”,
[Y,M,D,H,Min,S,Ms,Tz])。
事实上,它总是返回相同的Ms,因此,我认为我做得不好,在其他问题中,我只看到如何获得以毫秒为单位的总时间,而没有看到如何以这种方式格式化它


谢谢。

最简单的方法是使用库函数-它似乎满足您的所有要求

> calendar:system_time_to_rfc3339(os:system_time(millisecond), [{unit, millisecond}]).
"2021-03-03T18:42:08.497+05:30"
2018年6月发布的Erlang/OTP 21.0中添加了此功能



代码总是为
Ms
获取相同值的原因是
os:timestamp/0
返回的元组中的第一个值是兆秒,而不是毫秒;这三个值是兆秒、秒和微秒。这源于Erlang不支持大整数的时候,因此需要拆分时间戳。现在,您只需调用
os:system\u time/1
or,就可以得到一个整数的结果。

这个优秀答案的一个重要方面是,它只检索一次时间并将其转换为所需的格式。在问题中的原始代码中,
localtime
被调用两次,而
universaltime
被调用一次,这意味着代码中的计算是使用多个不同的时间值执行的,并且时区偏移可能会在这些不同时间的检索之间发生变化,产生错误的结果。这对我不起作用。现在我试图获取os:timestamp(){Mega,Seconds,Micro}并将其格式化为
yyyy-MM-dd'HH:MM:ss.SSSZ
,但我找不到任何方法返回毫…好吧,我想我知道为什么它对我不起作用,因为我有一个
io\u-lib:format/2
,我必须向它传递
atom()、string()或binary()
,这个函数返回一个
DateTimeString
,我需要将它转换成
string()
返回值
system\u-time\u-to\u-rfc339
应该算作
string()
,这样你就可以将它传递到
io-lib:format
像这样:
io-lib:format(“当前时间戳:~s~n”,[calendar:system\u-to\u-rfc339(操作系统:system_time(毫秒),[{unit,毫秒]])
这不起作用,因为我正在使用的erlang版本是17,而这个函数是更高的版本。所以…我正在寻找一个允许我这样做的函数,并且是17版