【问题标题】:How to format date/time in a specific timezone with the JavaScript date-fns library如何使用 JavaScript date-fns 库在特定时区格式化日期/时间
【发布时间】:2018-01-22 21:57:24
【问题描述】:

有没有办法使用date-fns 库在指定时区格式化/输出日期?我可以很容易地格式化日期:

format(
  new Date(),
  'MM/DD/YYYY'
)

我可以指定一个语言环境(来自他们的文档):

var eoLocale = require('date-fns/locale/eo')
var result = format(
  new Date(2014, 6, 2),
  'Do [de] MMMM YYYY',
  {locale: eoLocale}
)

如何指定时区?

【问题讨论】:

  • documentation for formatting 中似乎没有任何用于指定时区的标记,仅用于格式化它(“Z”或“ZZ”)。我希望“语言环境”不被用作“语言”的同义词。
  • 是的 RobG,我在格式文档中没有看到任何关于时区的信息。正在考虑有另一种方法来处理 date-fns 中的时区,或者它没有记录,因为这似乎是一个非常重要的功能......
  • 时区支持并非微不足道,有大量的区域,它们的偏移量和适用日期有很多变化,特别是自从 20 世纪夏令时开始流行以来。仅 Moment.js 时区支持的完整数据压缩后为 26kb。哦,IANA dataset 超过 300kb。

标签: javascript date datetime date-fns


【解决方案1】:

版本 2 拯救了这一天!

  const { startOfDay, endOfDay, format } = require('date-fns') // or use imports
  const { enGb } = require('date-fns/locale/en-GB') // or use imports

  const fromDate = startOfDay(new Date('02-Aug-2001'))
  const toDate = endOfDay(new Date('02-Aug-2001'))
  const from = format(fromDate, 'dd-MMM-yyyy HH:mm:ss', { locale: enGb })
  const to = format(toDate, 'dd-MMM-yyyy HH:mm:ss', { locale: enGb })
  console.log(from) // 02-Aug-2001 00:00:00
  console.log(to) // 02-Aug-2001 23:59:59

https://date-fns.org/v2.21.1/docs/format // 官方文档

https://www.npmjs.com/package/date-fns-tz#user-content-format // 更易于阅读的文档(注意不需要安装 date-fns-tz)

【讨论】:

    【解决方案2】:

    恐怕您将不得不等待time zone support in date-fns 直到2.0 版本发布。时区支持has not been finished,并且很可能只添加到新版本中,预计解析和格式化会得到改进。

    与此同时,您必须访问其他允许在任意时区格式化的库。例如Moment.jsDay.js

    // Print "06/01/2014 8:00:00 PM GMT-0400 (EDT)"
    
    moment('2014-06-02T00:00:00.000Z')
      .tz('America/New_York')
      .format('MM/DD/YYYY h:mm:ss A [GMT]ZZ (z)')
    
    dayjs('2014-06-02T00:00:00.000Z')
      .format('MM/DD/YYYY h:mm:ss A [GMT]ZZ (z)',
              { timeZone: 'America/New_York' })
    

    可运行代码 sn-p 将结果插入 HTML:

    // Initialise day.js extensions
    dayjs.extend(dayjs_plugin_timeZone)
    
    // Prepare the canvas
    const output = document.getElementById('output')
    output.innerHTML = 'Expected:  06/01/2014 8:00:00 PM GMT-0400 (EDT)\n'
    
    
    // Print "06/01/2014 8:00:00 PM GMT-0400 (EDT)"
    
    const date1 = moment('2014-06-02T00:00:00.000Z')
      .tz('America/New_York')
      .format('MM/DD/YYYY h:mm:ss A [GMT]ZZ (z)')
    output.innerHTML += `Moment.js: ${date1}\n`
    
    const date2 = dayjs('2014-06-02T00:00:00.000Z')
      .format('MM/DD/YYYY h:mm:ss A [GMT]ZZ (z)',
              { timeZone: 'America/New_York' })
    output.innerHTML += `Date.js:   ${date2}\n`
    <script src="https://unpkg.com/moment@2.24.0/min/moment-with-locales.min.js"></script>
    <script src="https://unpkg.com/moment-timezone@0.5.25/builds/moment-timezone-with-data.min.js"></script>
    
    <script src="https://unpkg.com/timezone-support@1.8.1/dist/lookup-convert.umd.js"></script>
    <script src="https://unpkg.com/timezone-support@1.8.1/dist/data.umd.js"></script>
    <script src="https://unpkg.com/dayjs-ext@2.2.0/dayjs.min.js"></script>
    <script src="https://unpkg.com/dayjs-ext@2.2.0/plugin/timeZone.js"></script>
    
    <pre id="output"></pre>

    【讨论】:

    • 我不相信你的第二个例子是正确的。
    • @JoeTidee,在my jsfiddle example 试试看,它确实有效。请注意,我使用my fork of day.js 直到官方支持时区。
    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 2020-06-15
    • 2021-11-14
    • 2021-01-23
    • 2021-08-03
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多