【问题标题】:Linux awk - How to convert date format : Wed 20 Apr 2018 19:56:52 GMT to Wed 20 Apr 2018 19:56:52 +02:00?Linux awk - 如何转换日期格式:2018 年 4 月 20 日星期三 19:56:52 GMT 到 2018 年 4 月 20 日星期三 19:56:52 +02:00?
【发布时间】:2021-06-30 18:03:51
【问题描述】:

我已经尝试转换该日期格式几个小时了。我想摆脱格林尼治标准时间并用我的时区替换,即 +02:00

awk -F, -v currentDate=`TZ="Europe/Paris" date -d  "23 hours ago" +%s`'{OFS=",";"date -d" $1" +%s"

1 美元 = 2018 年 4 月 20 日星期三 19:56:52 GMT

我一直得到与输出相同的输入,它似乎忽略了 TZ

我当前的时区是 +2h,所以要么将其附加到日期以代替 GMT,要么将日期转换为本地时间。

预期结果 = Wed 20 Apr 2018 19:56:52+02:00Wed 20 Apr 2018 21:56:52

【问题讨论】:

  • 我认为这个问题让我感到困惑的一件事是,您似乎在说您想更改时区,但不要让日期保持不变。换句话说,您不想在您的时区获得相同的实际时间,您只想修复输入的时区。对?这不需要任何日期操作 - 只需 sed 's/ GMT/+02:00/ ,对吗?我不知道23 hours ago 与任何事情有什么关系。
  • 您要插入逗号并将GMT 替换为+2:00
  • 该脚本不会产生 任何 输出,除非出现语法错误。请edit 将您的问题包含在minimal reproducible example 中,其中包含最少的完整脚本以及简洁、可测试的示例输入和预期输出,以便我们为您提供帮助。
  • 当你自己执行这些命令时:date -d "23 hours ago" +%sTZ="Europe/Paris" date -d "23 hours ago" +%s,你看到了什么?
  • 基本上我正在检索 GMT 日期,并希望使用我当前的时区 (+02:00) 将其转换为我的当地时间。我不能做sed s/ GMT/+02:00/,因为时区正在改变。但我认为将其转换为我的当地时间或附加我的时区都可以

标签: datetime awk date-format timezone-offset


【解决方案1】:
$ TZ="Europe/Paris" awk 'BEGIN{"date -d \"Wed 20 Apr 2018 19:56:52 GMT\"" | getline; print}'
Fri Apr 20 21:56:52 CEST 2018

【讨论】:

    【解决方案2】:

    我认为在这种情况下你不需要 awk :

    ~$ set - "Wed 20 Apr 2018 19:56:52 GMT"
    ~$ echo "$1"
    Wed 20 Apr 2018 19:56:52 GMT
    ~$ TZ=Europe/Paris date -d "$1" +"%a %d %b %Y %H:%M:%S%:z"
    Fri 20 Apr 2018 21:56:52+02:00
    ~$ TZ=Europe/Paris date -d "$1" +"%a %d %b %Y %H:%M:%S"
    Fri 20 Apr 2018 21:56:52
    

    【讨论】:

      【解决方案3】:

      格林威治标准时间 2018 年 4 月 20 日星期三 19:56:52 是星期五

      您的日期时间字符串Wed 20 Apr 2018 19:56:52 GMT 是错误的,因为20 Apr 2018 19:56:52 GMT 不是星期三;那是星期五。

      格林威治标准时间 2018 年 4 月 20 日星期五 19:56:52 = 2018 年 4 月 20 日星期五 21:56:52+02:00

      您在问题中提到的预期结果令人困惑,因为Fri 20 Apr 2018 19:56:52 GMT = Fri 20 Apr 2018 21:56:52+02:00。计算很简单:从日期时间中减去偏移值,得到等效的 GMT(或 UTC)日期时间。

      由于您已使用 标记问​​题,因此下面给出的是使用 Java 的解决方案:

      import java.time.OffsetDateTime;
      import java.time.ZoneOffset;
      import java.time.format.DateTimeFormatter;
      import java.util.Locale;
      
      public class Main {
          public static void main(String[] args) {
              String strDateTime = "Fri 20 Apr 2018 19:56:52 GMT";
              DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("EEE d MMM u H:m:s O", Locale.ENGLISH);
              OffsetDateTime odtGmt = OffsetDateTime.parse(strDateTime, dtfInput);
              OffsetDateTime odtOffsetTwoHrs = odtGmt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
              System.out.println(odtOffsetTwoHrs);
      
              // Output in a custom format
              DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEE d MMM u H:m:sXXX", Locale.ENGLISH);
              System.out.println(odtOffsetTwoHrs.format(dtfOutput));
          }
      }
      

      输出:

      2018-04-20T21:56:52+02:00
      Fri 20 Apr 2018 21:56:52+02:00
      

      ONLINE DEMO

      Trail: Date Time 了解有关现代日期时间 API 的更多信息。

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 2012-08-17
        • 1970-01-01
        • 2016-10-05
        • 2015-07-01
        相关资源
        最近更新 更多