【问题标题】:JS: parse time to pull out hours and minutes using date-fns, ignroing timezonesJS:使用 date-fns 解析时间以提取小时和分钟,忽略时区
【发布时间】:2020-04-08 06:36:19
【问题描述】:

我的后端向我发送以下格式的时间戳:2019-12-15T20:00:00.000Z,这是 UTC 时间。现在我需要的是在不修改时区的情况下提取时间。我正在使用date-fns,但每次我尝试获取时间时,我要么得到Invalid Date,要么将时间修改为本地时区。现在我的代码是:

import { format, parse, parseISO } from 'date-fns'

format(parseISO('2019-12-15T20:00:00.000Z'), 'h:mm a')

我想要的是:8:00 PM,但我得到的是 3:00 PM,因为它从 UTC 转换为 EST 时间(我的本地时区)。我知道我可以做 IsoString 之类的事情,然后解析字符串,但我正在寻找一种使用 date-fns 的方法,这样我就不必编写自定义字符串解析器了。必须有一种简单的方法来忽略时区吗?

【问题讨论】:

  • 这能回答你的问题吗? date-fns | How do I format to UTC
  • @iPhoenix 不是。这回答了如何将 Date 对象转换为 ISO 字符串,然后对字符串执行计算。在我的问题中,我的日期/时间戳已经在 ISO 字符串中。我正在寻找的是使用 date-fns 来轻松格式化该字符串。我也可以解析 ISO 字符串,但如果我使用 date-fns 的话,它看起来很糟糕。
  • 你可以使用原生的javascript日期对象吗?
  • 我是。我现在正在做类似的事情,我使用 vanilla JS 删除时区,然后使用该字符串,我进行日期操作,但我想我尝试看看是否有更好的解决方案。

标签: javascript date-fns


【解决方案1】:

我将回答我自己的问题,如果它对某人有帮助,我将如何使其工作,但我仍然想看看是否有更好的选择来代替仅使用 date-fns,因为我的似乎有点 hackish:

我所做的是从 ISO 字符串中删除时区,然后将该时间与 date-fns 一起使用:

let time = "2019-12-15T20:00:00.000Z".slice(0, -5)

上面是一个没有时区的时间,并且因为没有时区date-fns假定为本地时区,所以当你这样做时:

format(parseISO(time), 'h:mm a')

您会得到:8:00 PM,或您喜欢的任何格式。你只需要小心你正在切片的字符串。如果它总是相同的格式,那么它应该可以工作。

【讨论】:

  • 谢谢!这对知道 parseISO 会阻止添加时区信息非常有帮助!
  • 这就是答案,Javascript 中的日期是一场噩梦!!!
【解决方案2】:

这是一种使用 vanilla JS Date 对象手动格式化字符串的解决方案:


const date = new Date('2019-12-15T20:00:00.000Z');

function format(date) {
  const hours = date.getUTCHours();
  const minutes = date.getMinutes();

  return (1 + ((hours - 1) % 12)) + ":" + minutes.toString().padStart(2, "0") + " " + ((hours > 11) ? "PM" : "AM");
}

format(date);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2021-03-26
    • 2021-12-20
    • 1970-01-01
    • 2020-01-25
    • 2021-03-05
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多