【问题标题】:Moment.js - Inconsistent date on different devicesMoment.js - 不同设备上的日期不一致
【发布时间】:2021-11-16 14:23:36
【问题描述】:

我在显示日期方面遇到了一些问题。当用户选择一个日期时,我会像这样格式化它

new Date(date).toISOString().split('T')[0];

因为这是我们的 django 后端所期望的格式,然后后端返回这样的日期:

2021-09-02

然后我用 moment.js 格式化从后端返回的日期:

moment.utc(new Date(date)).format('MMM DD')

但问题是,当我选择“September 25”时,我会得到“Sep 25”。

但是我在印度的一些团队成员选择“9 月 25 日”,他们得到“9 月 24 日”。

如果我在我的开发工具中运行new Date('2021-09-02')。

我收到Wed Sep 01 2021 17:00:00 GMT-0700 (Pacific Daylight Time)

他们得到Date Thu Sep 02 2021 05:30:00 GMT+0530 (India Standard Time)

我该如何处理这种极端情况?我不确定是否需要更新存储在后端的格式。需要你的建议

【问题讨论】:

标签: javascript date momentjs moment-timezone


【解决方案1】:

这是一个时区问题,问题似乎是您想选择一个日期(9 月 25 日),但您实际上是在选择一个时间,然后将其转换为字符串来表示日期。

当您的用户选择日期时,您可以让他们选择日期和月份,而不是整个时间吗?

编辑

嗯,抱歉,问题不在于选择日期,而在于将服务器返回的日期转换为时间。但你不想要时间,你只想要一个日期。

您的服务器正在返回一个类似“2021-09-25”的字符串来表示“Sep 25”。您可以解析此字符串并获取重要部分:

function displayDayMonth(date) {
  const [_year, month, day] = date.split("-").map(s => parseInt(s, 10));
  const months = ["Jan", "Feb", //... etc ];
  return `${months[month - 1]} ${day}`;
}

const date = "2021-09-25";
displayDayMonth(date);
// => "Sep 25"

另一方面,如果时间真的很重要,会发生什么?如果太平洋时间的事件发生在 9 月 25 日,那么该事件的很大一部分发生在印度的 9 月 24 日。也许您没有捕捉到有关事件的足够详细信息?

【讨论】:

  • 用户选择的是日期和月份,而不是整个时间。我正在使用材料 ui datepicker material-ui-pickers.dev/demo/datepicker,然后像这样格式化从它返回的值 new Date(date).toISOString().split('T')[0]
  • 我在回答中添加了更多内容。让我知道这是否有帮助。
猜你喜欢
  • 2020-11-22
  • 2011-05-24
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多