erlang 如何获取yyyy-MM-dd 'T'HH格式的日期:mm:ss.SSSZ格式

wh6knrhe  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(161)

我想获取当前时间,并按以下方式设置其格式:
年-月-日时:分:秒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]).

事实是它总是返回相同的Ms,因此,我认为我做得不好,在其他问题中我只看到如何获得以毫秒为单位的总时间,而不是如何以这种方式格式化它。

  • 谢谢-谢谢
yv5phkfx

yv5phkfx1#

最简单的方法是使用库函数calendar:system_time_to_rfc3339/2-它似乎可以满足您的所有要求。

> 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返回的元组中的第一个值是 megaseconds,而不是毫秒;这三个值分别是毫秒、秒和微秒。这是在Erlang不支持大整数的时候产生的,所以拆分时间戳是必要的。现在你可以只调用os:system_time/1a number of other functions, depending on what kind of time you need,并得到一个整数的结果。

相关问题