【问题标题】:How to get a date in yyyy-MM-dd'T'HH: mm: ss.SSSZ format如何获取 yyyy-MM-dd'T'HH: mm: ss.SSSZ 格式的日期
【发布时间】:2021-06-02 01:16:32
【问题描述】:

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

yyyy-MM-dd'T'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]).

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

谢谢。

【问题讨论】:

    标签: date erlang


    【解决方案1】:

    最简单的方法是使用库函数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 返回的元组中的第一个值是兆秒,而不是毫秒;这三个值是兆秒、秒和微秒。这来自 Erlang 不支持大整数的时代,因此拆分时间戳是必要的。现在,您只需调用os:system_time/1a number of other functions, depending on what kind of time you need,即可得到单个整数的结果。

    【讨论】:

    • 这个出色答案的一个重要方面是它只检索一次时间并将其转换为所需的格式。在问题的原始代码中,localtime 被调用了两次,universaltime 被调用了一次,这意味着代码中的计算是使用多个不同的时间值执行的,并且时区偏移量可能会在这些不同的检索之间发生变化次,产生不正确的结果。
    • 这对我不起作用。现在我正在尝试获取 os:timestamp() {Mega, Seconds, Micro} 并将其格式化为yyyy-MM-dd'T'HH:mm:ss.SSSZ,但我找不到任何方法来返回毫...
    • 好吧,我想我知道为什么它对我不起作用了,因为我有一个 io_lib:format/2 ,我必须向它传递一个 atom (), string () or binary (),这个函数返回一个 DateTimeString我需要将其转换为string ()
    • system_time_to_rfc3339 的返回值应该算作string(),所以你可以像这样将它传递给io_lib:formatio_lib:format("Current timestamp: ~s~n", [calendar:system_time_to_rfc3339(os:system_time(millisecond), [{unit, millisecond}])])
    • 这不起作用,因为我正在使用的 erlang 版本是 17,而这个函数是更高版本的。所以...我正在寻找一个允许我这样做的功能,并且在版本 17 中
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多