1

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

请注意,我在六月的本地时区是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
4

1 回答 1

1

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

$ 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
于 2020-05-18T18:02:59.800 回答