从以秒为单位的 unix 时间到 ISO-8601 中的日期时间

From unix time in seconds to datetime in ISO-8601

长话短说;博士。如何从以秒为单位的 unix 时间转换为 ISO-8601 格式的日期时间?这看起来更像是图书馆问题而不是语言问题。

我希望能够将 ping 时间戳(unix 时间 + 微秒)解释为日期时间,以便能够将其可视化或对其执行日期和时间操作。我有很长的 ping 跟踪(数千行),其中每行表示 ping 的成功或失败。

我已经设法使用正则表达式制作了一个玩具示例来获取 unix 时间(没有微秒),但我没有找到如何在 APL 中使用日期时间。我在 Github 上找到了 APLteam 及其子项目 DateAndTime 上的 APLtree 项目,但我无法安装它。我不知道如何进行。

请注意,我知道我已经在 ping 时间戳前面以 ISO-8601 格式明确编写了日期时间,但为了学习 APL 的基础知识,我想操作日期时间。我还可以对 unix 时间执行操作,然后尝试(但如何)将它们转换为 ISO-8601 格式的日期时间。

跟踪是在 Linux 上使用以下命令生成的:

ping -n -i 30 -O -D my.domain.name | while read pong; do echo "[WAN] $(date --iso-8601=seconds): $pong"; done

输出轨迹为:

[WAN] 2020-01-31T18:02:35+0100: [1580490155.323878] 64 bytes from 8.8.8.8: icmp_seq=1037 ttl=234 time=720 ms
[WAN] 2020-01-31T18:03:34+0100: [1580490214.630890] no answer yet for icmp_seq=1038

APL 程序:

      v←('\[(\d+)\.'⎕S'')⊃⎕NGET'/Users/ludo/Desktop/so/ping.txt' 1
      v
 1580490155  1580490214
      ⍴v
2
      DISPLAY v
┌→──────────────────────────┐
│ ┌→─────────┐ ┌→─────────┐ │
│ │1580490155│ │1580490214│ │
│ └──────────┘ └──────────┘ │
└∊──────────────────────────┘

我还有一个问题:为什么 [] 的使用排名不同?在一种情况下我们有一个向量而在另一种情况下有一个简单的字符串(标量)吗?为什么 ⍴⍴v[1] 为零?请参阅下面的示例。

      v←⎕NGET'/Users/ludo/Desktop/so/ping.txt' 1
      v
  [WAN] 2020-01-31T18:02:35+0100: [1580490155.323878] 64 bytes from 8.8.8.8: ic
      mp_seq=1037 ttl=234 time=720 ms  [WAN] 2020-01-31T18:03:34+0100: [1580490
      214.630890] no answer yet for icmp_seq=1038   UTF-8-NOBOM  13 10
      DISPLAY v
┌→───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ┌→─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌→──────────┐ ┌→────┐ │
│ │ ┌→───────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌→──────────────────────────────────────────────────────────────────────────────────┐ │ │UTF-8-NOBOM│ │13 10│ │
│ │ │[WAN] 2020-01-31T18:02:35+0100: [1580490155.323878] 64 bytes from 8.8.8.8: icmp_seq=1037 ttl=234 time=720 ms│ │[WAN] 2020-01-31T18:03:34+0100: [1580490214.630890] no answer yet for icmp_seq=1038│ │ └───────────┘ └~────┘ │
│ │ └────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────────────────────────────────────┘ │                       │
│ └∊─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘                       │
└∊───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
      ⍴v
3
      v[1]
  [WAN] 2020-01-31T18:02:35+0100: [1580490155.323878] 64 bytes from 8.8.8.8: ic
      mp_seq=1037 ttl=234 time=720 ms  [WAN] 2020-01-31T18:03:34+0100: [1580490
      214.630890] no answer yet for icmp_seq=1038
      ⊃v
 [WAN] 2020-01-31T18:02:35+0100: [1580490155.323878] 64 bytes from 8.8.8.8: icm
      p_seq=1037 ttl=234 time=720 ms  [WAN] 2020-01-31T18:03:34+0100: [15804902
      14.630890] no answer yet for icmp_seq=1038
      ⍴v[1]

      ⍴⊃v
2
      ⍴⍴v[1]
0
      ⍴⍴⊃v
1

How to go from unix time in seconds to datetime in ISO-8601 format ?

      'date' 'days'⎕CY'dfns'
      unix0←days 1970 1 1
      sPerDay←24×60×60
      UnixToTs←date unix0+÷∘sPerDay
      TsToIso←{'--T::'@(2+3×⍳5)∊⍕¨(⊃,100+1∘↓)6↑⍵}   ⍝ modified from aplcart.info?q=iso8601
      UnixToIso←TsToIso UnixToTs
      UnixToIso 1580490155
2020-01-31T17:02:35

Try it online!

为了您的方便,这里是相反的:

      IsoToTs←⍎¨∊∘⎕D⊆⊢
      TsToUnix←sPerDay×unix0-⍨days
      IsoToUnix←TsToUnix IsoToTs
      IsoToUnix '2020-01-31T17:02:35'
1580490155

Try it online!


using a regular expression to get the unix time

如果你的文件是一致的,我推荐使用APL来提取数据,因为它可以产生巨大的速度差异。例如,如果所有行都使用这种格式:

      v←(⍎¯10↑43∘↑)¨⊃⎕NGET'/Users/ludo/Desktop/so/ping.txt' 1
      DISPLAY v
┌→────────────────────┐
│1580490155 1580490214│
└~────────────────────┘

why the rank difference between the usage of [] and ⊃ ?

[] 从不公开它从数组中提取的 ("opens up") 个元素,因此嵌套数组的元素保持封闭状态。

Do we have a vector in one case and a simple string in the other one (scalar) ?

是的,尽管在一种情况下最好将其表述为向量,而在另一种情况下将其表述为 封闭 向量。

Why is ⍴⍴v[1] zero ?

因为标量的秩(即使它包含更高秩的数组)为零。