javascript - 如何使用 Moment 解析没有偏移的时间字符串?

标签 javascript momentjs moment-timezone

我有一个特殊的用例,其中应用程序始终必须使用美国/芝加哥时区的时间。因此,我将 Moment 默认时区设置为 moment.tz.setDefault("America/Chicago");

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

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

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 作为底层 DateTime。

或者一些执行此操作的语句

嘿,服务器响应已经在“美国/芝加哥”时区,您不必做出任何时区假设。只需解析它并返回您自己的实例

有什么想法吗?

谢谢

最佳答案

如果您已经知道时区和字符串格式 - 您可以创建自己的 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>

关于javascript - 如何使用 Moment 解析没有偏移的时间字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250164/

相关文章:

javascript - 一天的 Moment js 间隔(12 小时格式)

angular - 如何在 Angular 中异步加载 momentjs 时区数据

javascript - 了解日期和时间到特定时区的转换

javascript - componentDidMount 在 ref 回调之前被调用

javascript - window.dialogArguments 在 Firefox 3 showModalDialog 函数中回发后重置

date - 将 Moment.js 默认日期格式设置为 dd/mm/yyyy

javascript - 如何将全日历的显示时间移动几分钟

javascript - momentjs 在时区中显示

javascript - jQuery添加的反斜杠怎么去掉

javascript - Zurb Foundation 下拉菜单不起作用