【问题标题】:Is there a function to get the UTC date in the Locale String Format?是否有以语言环境字符串格式获取 UTC 日期的功能?
【发布时间】:2022-02-10 20:10:13
【问题描述】:

我想在 JavaScript 中获取当前的 UTC 日期,但以本地日期格式显示它(就像 Date.toLocaleDateString() 一样)。

我首先尝试使用 Date.toUTCString() 获取当前的 UTC 日期,但这实际上并没有以本地格式打印出来。

然后我尝试使用toLocaleDateString() 中的选项配置,但这只是打印了本地日期,而不是本地格式的 UTC 日期。 例如新Date().toLocaleDateString(options = {timeZone: "UTC"})

然后我尝试使用Intl.DateTimeFormat() 进行格式化,但这与Date.toLocaleDateString() 的结果相同。

如果有办法获取语言环境格式,那么我很乐意使用该格式来格式化 UTC 日期,但据我所知没有。

例如,给定new Date("Sat, 30 Mar 2019 00:27:19 GMT"),在美国,我应该打印出“3/30/2019”,在欧洲,我应该打印出“30/3/2019”,等等,对于每个支持的语言环境.

但是,new Date("Sat, 30 Mar 2019 00:27:19 GMT").toLocaleDateString(options = {timeZone: "UTC"}) 将打印出“2019 年 3 月 29 日”。

【问题讨论】:

  • @HereticMonkey,我在问如何以本地格式显示当前的 UTC 日期。这与询问有关格式化日期的文档在哪里的重复如何?您链接到的帖子中的任何地方都没有解决我的问题。你能澄清一下吗?
  • 我不确定我是否理解您的意图。听起来您想向用户显示他们的语言环境的当前时间(毕竟,这与获取当前 UTC 时间,然后将其转换为某人的语言环境相同)。那么为什么不只是......这样做呢?客户端,(new Date()).toLocaleString(),我们已经完成了,不是吗?
  • 该问题的答案几乎涵盖了格式化Date 对象的所有可能方式。我不知道你怎么找不到答案。
  • @Mike'Pomax'Kamermans 这个想法是根据 UTC 获取实际日期,但以当地国家或地区的格式显示。没有在他们的时区获取日期并显示它。我已经在下面给出了一个答案,基本上就是我想要的。

标签: javascript date


【解决方案1】:

我还想使用本地化字符串设置显示日期,就像 toLocaleDateString() 一样,但使用日期的 UTC 值,而不是本地时区。

例如:

我确实想要本地化的字符串格式,但我也想要 UTC 值而不是本地时区值。此示例中所需的输出将是 4/3/2019,而不是 4/2/2019


我承认@AndersonH​​appens 的建议,但我没有使用它。这是我所做的,而不是:

有一个getTimezoneOffset()函数,提供本地时区偏移量。

我们可以使用这个函数结果并创建一个新的Date,应用差异。然后,我们可以像往常一样直接使用toLocaleDateString() 来获取本地化字符串格式的日期:

作为函数的解决方案可能是这样的:

function toLocaleUTCDateString(date, locales, options) {
    const timeDiff = date.getTimezoneOffset() * 60000;
    const adjustedDate = new Date(date.valueOf() + timeDiff);
    return adjustedDate.toLocaleDateString(locales, options);
}

【讨论】:

    【解决方案2】:

    给定一个日期,您可以使用new Intl.DateTimeFormat() 获取语言环境格式。 然后,您可以使用formatToParts 来获取日期和每个特定组件的格式。

    按照the formatToParts documentation 中的示例,我创建了以下方法来获取语言环境字符串中的UTC 日期。

    function toLocaleUTCDateString(date) {
      let formatter = new Intl.DateTimeFormat();
      return formatter.formatToParts(date).map(({type, value}) => { 
        switch (type) {
          case 'day': return date.getUTCDate();
          case 'hour': return date.getUTCHours();
          case 'minute': return date.getUTCMinutes();
          case 'month': return date.getUTCMonth() + 1;
          case 'second': return date.getUTCSeconds();
          case 'timeZoneName': return "UTC";
          case 'year': return date.getUTCFullYear();
          default : return value; 
        } 
      }).reduce((string, part) => string + part);
    }
    

    但请注意,此方法不记得数字与字符串格式。例如,如果您想将 March 月份显示为“March”(或特定语言月份字符串),而不是数字 3,则您必须自己弄清楚如何做到这一点。它也不处理工作日的差异,因此如果本地日期是“星期五”而 UTC 日期是“星期六”,您也必须单独计算。

    【讨论】:

    • 但更好的解决方案是不要编写自己的代码,而是使用moment.js,这是 JS 领域的 defactor time 库。
    【解决方案3】:
    var dateToPrint = new Date(Date.UTC(2020, 3, 23, 15, 0, 0));
    
    new Date(
      dateToPrint.getUTCFullYear(),
      dateToPrint.getUTCMonth(),
      dateToPrint.getUTCDate(),
      dateToPrint.getUTCHours(),
      dateToPrint.getUTCMinutes(),
      dateToPrint.getUTCSeconds()
    ).toLocaleString('es-ES')
    

    see image

    【讨论】:

      【解决方案4】:

      您几乎猜对了——timeZone 选项在第二个参数中可用。 toLocaleDateString 的第一个参数用于语言环境。

      This example from your question works when options are the second argument (and is much simpler than other answers):

      new Date("Sat, 30 Mar 2019 00:27:19 GMT").toLocaleDateString(undefined, {timeZone: "UTC"})
      // '3/30/2019'
      

      【讨论】:

        【解决方案5】:

        查看Intl.DateTimeFormat on MDN

        使用起来很简单

        // do this once in a central library file
        const formatter = new Intl.DateTimeFormat('en', {
          timeZone: 'UTC',
          timeZoneName: 'short',
          month: 'short',
          day: '2-digit',
          hour12: false,
          hour: '2-digit',
          minute: '2-digit',
        })
        
        // reuse anywhere for consistency
        const myDate = new Date(
          'Thu Feb 10 2022 12:50:14 GMT+0100'
        )
        
        formatter.format(myDate) === 'Feb 10, 11:50 UTC' // true
        

        打开您的控制台,复制粘贴代码并开始播放!

        再说一遍,Intl.DateTimeFormat on MDN

        享受吧!

        【讨论】:

          【解决方案6】:

          toLocaleString接收一些参数,第一个参数是locale。要专门解决您的问题,您需要了解 UTC 不是语言环境。您可以通过3/29/2019 的“en-US”和29/03/2019 的“en-GB”来完成您想要的操作,希望对您有所帮助!

          【讨论】:

            猜你喜欢
            • 2023-04-03
            • 2020-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-23
            • 2011-10-06
            相关资源
            最近更新 更多