【问题标题】:Convert TimeZone Time string correctly into Local Time将 TimeZone 时间字符串正确转换为本地时间
【发布时间】:2021-01-07 06:38:35
【问题描述】:

我正在尝试转换从我们的后端系统返回的时间字符串,但我无法获得正确的本地时间。

后端返回的时间字符串:"2020-08-28T07:00:00.000Z"

预计需要的当地时间:Aug 28, 2020 12:00 AM

我试过了:

  1. Moment.js 转换失败:

        moment(backendTime).format(
         "MMM D,YYYY h:mm a"
      ) 
    

    不知怎的,我得到了“Jan 1st 20 12:00 AM”,我完全不明白

  2. 通过转换为Date 也失败了:

  Date("2020-08-28T07:00:00.000Z")

最终得到:“ Mon Sep 21 2020 00:07:29 GMT-0700 (Pacific Daylight Time)”

我现在的想法不多了,我觉得不应该这么难,但就是无法做到。

【问题讨论】:

  • 你在哪个时区?
  • @AlwaysHelping 我在太平洋时间,时区是否是没有将其转换为正确时间的原因?
  • 您也可以使用它来更改日期格式:- console.log(format(new Date(), 'yyyy/MM/dd kk:mm:ss'))

标签: javascript reactjs date timezone momentjs


【解决方案1】:

你得到的格式正是你所要求的。

要使用 moment.js 获得所需的输出,您需要使用以下格式:

moment(backendTime).format("MMM DD, YYYY hh:mm A");

你可以在这里测试它:https://jsfiddle.net/oz6mx3nh/

【讨论】:

    【解决方案2】:

    在 vanilla JS 中,您可以使用 DateTimeFormat 根据时区格式化您的日期。 DateTimeFormat 的所有选项都是documented here

    区域设置 (en-US) 的不同选项是 listed here

    这是所有时区的full list

    查看底部 sn-p 了解每个语言环境的输出(在提供的列表中)

    const date = new Date("2020-08-28T07:00:00.000Z");
    
    const format = new Intl.DateTimeFormat(
      "en-US",
      {
        month: "short",
        day: "2-digit",
        year: "numeric",
        hour: "2-digit",
        hour12: true,
        minute: "2-digit",
        timeZone: "America/New_York",
      }
    ).format(date)
    
    console.log(format);

    每个语言环境的输出列表:

    const date = new Date("2020-08-28T07:00:00.000Z");
    
    const locales = ["ar-SA", "bn-BD", "bn-IN", "cs-CZ", "da-DK", "de-AT", "de-CH", "de-DE", "el-GR", "en-AU", "en-CA", "en-GB", "en-IE", "en-IN", "en-NZ", "en-US", "en-ZA", "es-AR", "es-CL", "es-CO", "es-ES", "es-MX", "es-US", "fi-FI", "fr-BE", "fr-CA", "fr-CH", "fr-FR", "he-IL", "hi-IN", "hu-HU", "id-ID", "it-CH", "it-IT", "jp-JP", "ko-KR", "nl-BE", "nl-NL", "no-NO", "pl-PL", "pt-BR", "pt-PT", "ro-RO", "ru-RU", "sk-SK", "sv-SE", "ta-IN", "ta-LK", "th-TH", "tr-TR", "zh-CN", "zh-HK", "zh-TW"];
    
    const formatDate = (locale, date) => new Intl.DateTimeFormat(
      locale,
      {
        month: "short",
        day: "2-digit",
        year: "numeric",
        hour: "2-digit",
        hour12: true,
        minute: "2-digit",
        timeZone: "America/New_York",
      }
    ).format(date);
    
    // Loop over each locale
    for(const locale of locales) {
      const formatted = formatDate(locale, date);
      
      console.log(`${locale}: ${formatted}`);
    }

    【讨论】:

      【解决方案3】:

      一些事情:

      • 假设您的计算机设置为太平洋时间,那么:

        moment("2020-08-28T07:00:00.000Z").format("MMM D, YYYY h:mm a")
        //=> "Aug 28, 2020 12:00 am"
        

        这确实会返回您期望的值。你说你得到了"Jan 1st 20 12:00 AM",但这是不可能的,因为值和格式都不匹配。

      • 当您尝试 Date 对象时,您得到了您所做的结果,因为您省略了 new 关键字 (see this explanation)。它应该是:

        new Date("2020-08-28T07:00:00.000Z")
        

        请记住,这会产生一个Date 对象。如果您直接记录该对象,则结果是特定于实现的。它可能因浏览器而异。相反,您应该从中调用一个函数,例如 toStringtoLocaleString

      • 如果这是一个新项目,您可能应该避免使用 Moment。请阅读https://momentjs.com/docs/#/-project-status/

      【讨论】:

        猜你喜欢
        • 2012-10-03
        • 2012-05-30
        • 1970-01-01
        • 2011-06-13
        • 2020-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        相关资源
        最近更新 更多