【问题标题】:Remove timezone from a moment.js object从 moment.js 对象中删除时区
【发布时间】:2016-03-07 03:29:52
【问题描述】:

我正在使用datetimepicker.js,它的date 函数返回一个moment.js 对象。它使用本地 UTC 偏移量来实现,而我的原始日期有不同的偏移量。

我原来的日期:

2015-10-01T15:00:00.000Z

我在日期时间选择器上显示的内容 (DD-MM HH:mm):

01-10 15:00

我得到了什么:

2015-10-01T15:40:00+01:00

我想要什么:

2015-10-01T15:40:00+00:00

请注意我是如何在末尾删除 +01 偏移量的。

如何将其应用于任何本地 UTC?也就是说,无需手动删除 01(因为它可以是任何其他本地偏移量,具体取决于用户位置)。

var momentDate = timePicker.data("DateTimePicker").date();
console.log(momentDate.format());
//this prints  2015-10-01T15:40:00+01:00

【问题讨论】:

  • 您能提供一些代码或小提琴来演示吗?这很容易,但我不知道您在这个 datetimepicker 控件中使用了哪些 API。

标签: javascript datetimepicker momentjs


【解决方案1】:

您需要明确指定格式。

试试这个:

momentDate.format('YYYY-MM-DDTHH:mm:ss')

这将给出结果

2015-10-01T15:40:00

【讨论】:

  • 这会删除时区吗?
  • 是的,正是@Jordan
【解决方案2】:

听起来您正试图让用户选择一个基于 UTC 的日期和时间。因此,最好的方法是让选择器在创建开始时刻时以 UTC 模式运行。我不熟悉这个特定的 datetimepicker,但假设它在内部的某个地方做了这样的事情:

var m = moment([year, month-1, day, hour, minute]);

那么应该改为这样做:

var m = moment.utc([year, month-1, day, hour, minute]);

(此处显示的变量来自选取器控件。)

理想情况下,选择器控件应包含设置 UTC 模式的功能,以便它可以在您告知时在内部执行此操作。

如果它没有这样的功能,你仍然可以补偿自己。不幸的是,您不能只打电话给.utc(),因为这会给出与用户选择的时间不同的时间。因此,您必须通过将 UTC 时间偏移原始时刻的偏移量来进行补偿。

var m = // moment value from the picker
var result = moment(m).utc().add(m.utcOffset(), 'm');

然后您可以致电format 或任何您希望的结果。请注意,原始时刻是用moment(m)克隆的,这样偏移量不会丢失,并且切换到 UTC 不会干扰选择器的内部行为。

另外,请注意,像这样 shifting 通常是一种 hack,如果做错了可能会导致错误。在这里没关系,因为应用调整时已经处于 UTC 模式。但作为一般解决方案,应避免移位。最好的选择是一开始就将控件置于 UTC 模式。

【讨论】:

  • 对我来说,只有当我使用 var result = moment(m).add(m.utcOffset(), 'm').utc(); 时它才有效。如果 utc() 在 add 之前,则 utcOffset 不输出任何内容
  • @TheFullResolution - 我想也许你用的是m.utc().add... 而不是moment(m).utc().add...
【解决方案3】:

试试这个:

let str = '2015-10-01T15:40+01:00';
let moment = moment(str).utcOffset(str)
console.log(moment.format('DD/MM/YYYY HH:mm'))
<script src="https://momentjs.com/downloads/moment.js"></script>

【讨论】:

    【解决方案4】:

    这对我有用:

    let date = "2017-02-01 15:20:00.00";
    let pattern = "YYYY-MM-DD HH:mm:ss.SS"
    let d = moment(date, pattern).utc(false);
    

    它仍然会说它考虑了时区,但我发现它没有。

    LOG: 'ParseDateStr::2017-2-1 15:20:00.0000000
    ParsedDate::Wed Feb 01 2017 15:20:00 GMT+0100 (Central European Standard Time)'
    

    通常,只有moment(date, pattern) 它会解析为16:20:00

    【讨论】:

      【解决方案5】:

      不是一个干净的解决方案,但你可以这样做

      momentDate.format('YYYY-MM-DDTHH:mm:ss') + '00:00';
      

      这将删除时区,然后将“00:00”部分重新添加回来。这是为了扩展马特的答案。

      哪个会给你

      2015-10-01T15:40:00+00:00

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 2021-07-23
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 2017-08-15
        相关资源
        最近更新 更多