От unix время в секундах до даты в ISO-8601 - PullRequest
1 голос
/ 02 февраля 2020

TL; DR. Как go от unix времени в секундах до даты-времени в формате ISO-8601? Это больше похоже на вопрос библиотеки, чем на вопрос о языке.

Я хотел бы иметь возможность интерпретировать метку времени пинга (unix время + микросекунды) как дату / время, чтобы иметь возможность визуализировать ее или выполнять дату и время операций на нем. У меня есть длинная трассировка пинга (тысячи строк), где каждая строка указывает на успех или неудачу пинга.

Мне уже удалось создать игрушечный пример с использованием регулярного выражения для получения времени unix (без микросекунды) но я не нашел, как использовать datetime в APL. Я нашел проект APLtree на Github от APLteam и их подпроекта под названием DateAndTime, но я не смог его внедрить. Я не знаю, как поступить.

Обратите внимание, что я знаю, что у меня уже есть дата и время, записанные явно в формате 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'\1')⊃⎕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

1 Ответ

1 голос
/ 02 февраля 2020

Как go из unix время в секундах до даты в формате ISO-8601?

      '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

Попробуйте онлайн!

Для вашего удобства, вот обратное:

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

Попробуйте онлайн!


с использованием регулярного выражения для получения unix time

Если ваш файл непротиворечивый, я рекомендую использовать APL для извлечения данных, так как это может привести к огромной разнице в скорости. Например, если все строки используют этот точный формат:

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

, почему разница в рангах между использованием [] и ⊃?

[] никогда не раскрывает («открывает») элементы, которые он извлекает из массива, поэтому вложенные элементы массива остаются закрытыми.

У нас есть вектор в одном случае и простая строка в другом (скалярном)?

Да, хотя лучше обозначить его как вектор в одном случае, а заключенный вектор в другом.

Почему ⍴⍴v [1] равен нулю?

Поскольку ранг скаляра (даже если он содержит массив более высокого ранга) равен нулю.

...