如何在没有日期的情况下用时刻来解析本地时间?

问题描述 投票:0回答:1

輸入 8:30 PM 当地日期为2020年5月12日,而UTC日期已经是2020年5月13日。

理想的输出 2020-05-12 20:30:00

实际产出 2020-05-13 20:30:00


尝试了3件事。

result = moment('8:30 PM', 'h:mm A').format('YYYY-MM-DD HH:mm:ss');

result = moment.tz('8:30 PM', 'h:mm A', 'America/New_York').format('YYYY-MM-DD HH:mm:ss');

moment.tz.setDefault('America/New_York');
result = moment.tz('8:30 PM', 'h:mm A', 'America/New_York').format('YYYY-MM-DD HH:mm:ss');
javascript datetime momentjs moment-timezone
1个回答
1
投票

正如user120242所说,似乎moment.tz在从时间中创建日期时使用了当前的UTC日期。如果你想在目标时区使用当前日期,一个小技巧是为日期创建一个字符串,加上你的时间字符串,然后解析它,比如说。

moment.tz.setDefault('America/New_York');

let timeString    = '8:30 PM';
let inputFormat   = 'YYYY-MM-DD HH:mm A'
let dateFormat    = 'YYYY-MM-DD';
let displayFormat = 'YYYY-MM-DD HH:mm:ss ZZ';

// Current date in New York
let now = moment();
// Create a timestamp for required time
let nyString = now.format(dateFormat) + ' ' + timeString;
// Create a date for 8:30 in New York
let then = moment(nyString, inputFormat);

console.log('Now in New York    : ' + now.format(displayFormat));
console.log(timeString + ' in New York: ' + then.format(displayFormat));
console.log('Sans kludge in NY  : ' + moment(timeString, 'HH:mm A').format(displayFormat));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.28/moment-timezone-with-data.js"></script>

要看到它的工作,你需要设置你的时钟,使纽约与UTC是不同的日期。


0
投票

当运行那里尝试的第二段代码时,控制台包含一个错误。

Moment Timezone没有AmericaNew_York的数据。请看 http:/momentjs.comtimezonedocs#data-loading。.

如果你还没有加载一组时区数据到 moment 中,它就不会有数据用于解析。在尝试运行任何与时区相关的功能之前,请检查你是否已经将时区数据加载到了 moment 中。如果你不确定如何将数据加载到 moment 中,请查看错误信息中列出的文档部分。此处.


0
投票

请明确你到底要解决什么问题;OP,无论如何你都不应该这样做,因为如果把时间发送到另一台电脑上,时间就会变得模糊不清。 如果目前的时间是12AM或11:59PM,人在不同的时区,你发送的时间就会变得模棱两可。如果你真的还一定要这样做,你就必须在结果上设置日期,或者在计算出 "想要 "的日期后,手动设置小时和分钟,始终计算出是最近24小时内的时间。

是的,时区插件有问题。 实际中,当是现在之前的时间时,moment()也会出现错误的行为。 但我想不出一个有效的使用案例,你现在试图使用它的方式,而且你的使用方式已经不能很好的定义它应该如何表现了。

证明了这个问题。

moment.tz.setDefault('America/New_York');
result = moment.tz('8:30 PM', 'h:mm A', 'America/New_York').format('YYYY-MM-DD HH:mm:ss');

// set your clock to a time when UTC date will be tomorrow (or yesterday) to see the problem
console.log([result,
moment('12:01AM', 'h:mm A').format('YYYY-MM-DD HH:mm:ss'),
moment.tz('12:01 AM', 'h:mm A', moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'),
moment('11:59PM', 'h:mm A').format('YYYY-MM-DD HH:mm:ss'),
moment.tz('11:59 PM', 'h:mm A', moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss')].join('\n')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment-with-locales.min.js" integrity="sha256-8d6kI5cQEwofkZmaPTRbKgyD70GN5mDpTYNP9YWhTlI=" crossorigin="anonymous"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.28/moment-timezone-with-data.js" integrity="sha256-O1PdKrSbpAYWSBteb7yX/CMmHhu3US31mtCbsryGwaY=" crossorigin="anonymous"></script>
© www.soinside.com 2019 - 2024. All rights reserved.