【问题标题】:How to parse time string without offset using Moment?如何使用 Moment 解析没有偏移的时间字符串?
【发布时间】:2019-10-05 16:21:18
【问题描述】:

我有一个特殊的用例,应用程序总是必须使用America/Chicago 时区的时间。所以我将 Moment 默认时区设置为moment.tz.setDefault("America/Chicago");

通过此设置,我将所有日期时间输入从客户端以America/Chicago 时区以js 格式MM/DD/YYYY h:mm A 发送到服务器。并且每当客户端请求时间字段时,服务器都会以America/Chicago时区和相同的格式返回时间。

现在有一种情况,我必须解析服务器返回的这个日期时间值,并将其与当前的America/Chicago 时间进行比较。我试过了,

moment.tz.setDefault("America/Chicago");

let now = moment();

// serverResponse is America/Chicago datetime string in format MM/DD/YYYY h:mm A

let serverResponseMoment = moment(serverResponse);

// The above statement is where I am facing issue. Since the users could be from
// anywhere, moment(serverResponse) will be assuming the serverResponse string to
// be of the local timezone as there is no offset part attached to the string.

return now.isBefore(serverResponseMoment);

也试过了

let serverResponseMoment = moment.tz(serverResponse,"America/Chicago");

// The above statement assumes the serverResponse to be in UTC and give me an "America/Chicago"
// date-time after conversion

我也试过moment.utc(serverResponse)。执行最后一次条件检查时,所有解析都失败。

我想要的是一个时刻实例,在已经设置的默认时区中,将我的 serverResponse 作为基础日期时间。

或一些这样做的语句

Hey Moment, serverResponse is already in "America/Chicago" timezone, you don't have to make any sort of timezone assumptions. Just parse it and return an instance of yourself

有什么想法吗?

谢谢

【问题讨论】:

  • moment.js 的哪个版本?你用moment-timezone.js吗?
  • @fen1x 我正在使用 "moment-timezone": "^0.5.21" 安装了 moment 2.24 作为依赖项

标签: javascript momentjs moment-timezone


【解决方案1】:

如果您已经知道时区和字符串格式 - 您可以创建自己的 serverResponse 解析器:

const momentParserFactory = (format, tz) => (str) => moment.tz(str, format, tz);
const chicagoMoment = momentParserFactory('MM/DD/YYYY h:mm A', 'America/Chicago');

let now = moment();
let serverResponse_1 = '10/07/2019 11:40 AM';
let serverResponseMoment_1 = chicagoMoment(serverResponse_1);

console.log(`"Now" is: ${now.format()}`)
console.log(`Server response date 1: ${serverResponseMoment_1.format()}`);
console.log(`"Now" is before server response date 1: ${now.isBefore(serverResponseMoment_1)}`);

let serverResponse_2 = '10/09/2020 4:20 AM';
let serverResponseMoment_2 = chicagoMoment(serverResponse_2);

console.log(`Server response date 2: ${serverResponseMoment_2.format()}`);
console.log(`"Now" is before server response date 2: ${now.isBefore(serverResponseMoment_2)}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.26/moment-timezone-with-data.min.js"></script>

【讨论】:

  • 这正是我想要的moment.tz("10/07/2019 11:40 AM",'MM/DD/YYYY h:mm A', 'America/Chicago')。我昨天需要解决这个问题。所以我重写了服务器端以 RFC 格式发送时间。所以时区已经存在于输入字符串中,因此即使我不得不做一些额外的工作,我的所有警告和错误都已修复:) 谢谢
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2019-09-13
  • 2015-12-28
相关资源
最近更新 更多