Miller 如何将本地日期和时间转换为 UTC?

Posted

技术标签:

【中文标题】Miller 如何将本地日期和时间转换为 UTC?【英文标题】:How can Miller convert a local date and time to UTC? 【发布时间】:2020-09-04 14:01:16 【问题描述】:

Miller 5.6.2 如何使用比以下更简单的表达式将本地日期和时间转换为 UTC

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=sec2gmt(
    localtime2sec(
      strftime(
        strptime($time1, "%Y-%m-%d %H:%M %p"),
        "%Y-%m-%d %H:%M:%S")));'
time1
2019-06-13T10:54:00Z

请注意,我 6 月份的本地时区是 EDT-04:00

$ date --date='2019-06-13 05:54 PM' '+%Y-%m-%dT%H:%M:%S %Z'
2019-06-13T17:54:00 EDT
$ date --date='2019-06-13 05:54 PM' '+%Y-%m-%dT%H:%M:%S%z'
2019-06-13T17:54:00-0400

【问题讨论】:

【参考方案1】:

我发现了两个类似的表达式,它们都使用strptime_local()而不是strptime()来解析本地日期和时间字符串,并将其转换为UTC(格林威治标准时间)纪元以来的秒数:

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=strftime(
    strptime_local($time1, "%Y-%m-%d %H:%M %p"),
    "%Y-%m-%dT%H:%M:%SZ");'
time1
2019-06-13T10:54:00Z
$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=sec2gmt(strptime_local($time1, "%Y-%m-%d %H:%M %p"));'
time1
2019-06-13T10:54:00Z

strftime()sec2gmt() 都假定自 UTC 纪元以来的秒数。

函数strptime() 假定输入日期和时间字符串为UTC,并忽略输入字符串中的时区:

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=strptime($time1, "%Y-%m-%d %H:%M %p");'
time1
1560405240.000000
$ printf "time1\n2019-06-13 05:54 PM EDT\n" | mlr --csv put '
  $time1=strptime($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560405240.000000

函数strptime_local() 也忽略输入日期和时间字符串中的时区,但假定该字符串位于本地时区并将其转换为UTC:

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p");'
time1
1560423240.000000
$ printf "time1\n2019-06-13 05:54 PM EDT\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560423240.000000
$ printf "time1\n2019-06-13 05:54 PM EST\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560423240.000000
$ printf "time1\n2019-06-13 05:54 PM AUT\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560423240.000000

【讨论】:

原来***.com/revisions/61876042/2 中的两个表达式都没有给出正确的结果。日期和时间 2019-06-13 05:54 PM -0400 实际上转换为 UTC 中的 2019-06-13 21:54:00 +0000(请参阅 date --utc --date="2019-06-13 17:54 -0400" "+%F %T %z")。

以上是关于Miller 如何将本地日期和时间转换为 UTC?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UTC 日期字符串转换为本地时间 (systemTimeZone)

如何将UTC时间转化为本地时间

如何使用js将UTC日期转换为本地时间? [复制]

在 VBA 中,如何以简单的方式将 UTC UNIX 时间戳转换为本地时区日期?

如何仅使用标准库将 UTC 日期时间转换为本地日期时间?

将 UTC 日期时间转换为 pandas 中的本地日期时间