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

Csv Miller如何将本地日期和时间转换为UTC?,csv,utc,gmt,localtime,miller,Csv,Utc,Gmt,Localtime,Miller,如何使用比以下表达式更简单的表达式将本地日期和时间转换为 $ 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 请注

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

$ 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

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

和都假定自UTC中的历元起的秒数

函数
strtime()
采用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
函数
strtime_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

结果表明,中的两个表达式都没有给出正确的结果。日期和时间
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
)。
$ 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