【问题标题】:Moment dates are parsed different in Mozilla and Chrome?Mozilla 和 Chrome 中的时刻日期解析不同?
【发布时间】:2017-03-14 14:19:53
【问题描述】:

我在 Mozilla 中遇到日期问题,我在我的项目中为 angularJs 使用 fullcalendar 插件。在使用时刻日期时,Chrome 似乎工作正常,但 Mozilla 似乎坏了。我正在使用时区。许多博客和帖子似乎在遇到跨浏览器问题时提到了时刻日期的格式。

来了,

  console.log(moment(new Date('2017-02-28T18:30:00')).format('dddd-MMM DD,YYYY'));

Mozilla:2017 年 2 月 28 日,星期二

Chrome:2017 年 3 月 1 日,星期三

我真的坚持这一点,并且我看到过关于使用时刻日期提及格式的帖子,但我使用了上述示例中的格式,但它无法返回所需的输出。另一方面,Chrome 正在返回正确的结果,我做错了什么?

如果您需要任何详细信息,请发表评论。

【问题讨论】:

    标签: javascript angularjs fullcalendar momentjs mozilla


    【解决方案1】:

    不要使用moment(new Date('2017-02-28T18:30:00')),而是使用moment(String)(因为您的输入是 ISO 8601 格式)。

    正如时刻 parsing docs 所说:

    警告:浏览器支持解析字符串is inconsistent。因为没有关于应该支持哪些格式的规范,所以在某些浏览器中有效的内容在其他浏览器中无效。

    这是一个工作示例:

    console.log(moment('2017-02-28T18:30:00').format('dddd-MMM DD,YYYY'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

    如果您的输入是 UTC,请使用 moment.utc:

    moment.utc('2017-02-28T18:30:00')
    

    如果您的输入位于给定时区(例如Asia/Calcutta),请使用moment.tz(..., String);

    moment.tz('2017-02-28T18:30:00', 'Asia/Calcutta')
    

    默认时刻解析字符串在本地时间,你需要知道你输入的时区。注意 moment 有 local()utc()tz(String) 方法来更改 moment 对象的时区。

    【讨论】:

    • 我以前试过这个,现在日期下降到 2 月 28 日。我需要像 3 月 1 日一样。
    • 尝试时刻(string).utc().format('dddd-MMM DD,YYYY')
    • @Jaychandran 为什么2017-02-28T18:30:00 应该被解释为2017-03-01?也许您必须为您的问题添加详细信息。
    • 我已经在日历中添加了该日期的详细信息,我正在使用时区信息来添加详细信息。那么我应该如何将此字符串解析为我的本地区域,我使用了时刻时区。 Chrome 给了我正确的日期,所以我坚持选择,直到 Mozilla 崩溃。
    • @Jaychandran 我已经更新了我的答案,希望对您有所帮助。请注意,您必须知道如何处理输入字符串。它代表当地时间吗?还是UTC?还是给定的时区?
    【解决方案2】:

    您正在将 JS 日期转换为 MomentJS 日期,因此我只能假设 Firefox 以不同方式解析 JS 日期。

    使用 MomentJS,您应该能够简单地替换您的代码:

    moment(new Date('2017-02-28T18:30:00')).format('dddd-MMM DD,YYYY')
    

    与:

    moment('2017-02-28T18:30:00').format('dddd-MMM DD,YYYY')
    

    https://momentjs.com/docs/#/parsing/

    【讨论】:

    • 已经尝试过这个,但是我们将如何像 Chrome 那样将它解析到 3 月 1 日
    • 您确定 chrome 将 '2017-02-28T18:30:00' 解析为 3 月 1 日而不是另一个字符串吗?因为仅查看日期本身,除非您在其中添加一天,否则我无法将其解析为一天后。
    • 是的,我在其他地方使用时区
    【解决方案3】:

    如果你使用angularjs,使用filter会更容易。

    $filter('date')('2017-02-28T18:30:00', "dd/MM/yyyy");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-15
      • 2016-06-24
      • 2011-09-19
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多