【问题标题】:Moment.js and timezone doesn't work only on Android ChromeMoment.js 和时区不仅适用于 Android Chrome
【发布时间】:2017-06-23 18:32:31
【问题描述】:

我添加了 moment.js 来管理我的 web 应用程序中的时区。我在新西兰 (GTM +13) 设置了我的设备,并且可以正常工作:

  • iPhone:Safari 和 Chrome
  • 安卓:火狐
  • OSX:Safari 和 Chrome

返回 1 天(我在 GTM +0)。但它在 Android Chrome 上不起作用(我用几个 Android 设备对其进行了测试),我不知道为什么。我的代码:

  var dateFunctions = {

    "getCurrentDate": function(){
      return moment().valueOf();
    },

    //I need Date type to use in a custom Calendar component.
    "getFormatDate": function(dateLong){
      var d = moment(parseInt(dateLong)).toDate();
        },

   //For jquery calendar. input: Date without local time; output: timestamp
   "getDate": function(date){
      var currentDay = moment();
      var d = moment(date).set("hour",currentDay.get("hour")).set("minute",currentDay.get("minute")).set("second",currentDay.get("second")).set("millisecond",currentDay.get("millisecond"));
      return d.valueOf();

    },

        ...
        }

... ...

//it should return tomorrow (GTM +13) in Android Chrome
var currentDay = managedates.getFormatDate(managedates.getCurrentDate())

我认为这可能与与 Android 设备关联的 google 帐户有关。有什么想法吗?

编辑:我对其进行了编辑以添加我更新的代码

【问题讨论】:

    标签: javascript angularjs google-chrome timezone momentjs


    【解决方案1】:

    一些事情:

    • 您的timezoneOffset 变量名实际上是时区标识符,而不是偏移量。没什么大不了的,但可能会引起一些混乱。

    • 您实际上根本不需要时刻时区。 Moment.js 可以在本地时区工作,无需 moment-timezone 的帮助。

    • 无论如何,当您使用数字时间戳时,时区是无关紧要的。 Unix 时间始终基于 UTC。

    • 无需在 */ 1000 中使用基于秒的函数。Moment 可以为您处理。

    您的代码,已更正:

    "getCurrentDate": function(){
      return moment().valueOf();
    },
    
    "getFormatDate": function(dateLong){
      return moment(dateLong).toDate();
    },
    

    更进一步 - 由于您只使用数字时间戳和日期对象,因此根本没有充分的理由在这里使用 Moment。

    "getCurrentDate": function(){
      return Date.now();
    },
    
    "getFormatDate": function(dateLong){
      return new Date(dateLong);
    },
    

    如果您尝试使用当地时间,则需要更清楚地了解来回发送数据的方式。您不能使用时间戳来做到这一点并保留本地时间。 Unix 时间戳中没有关于本地时间或时区的信息。

    【讨论】:

    • webapp 是关于预订的,服务器无法检查客户端的时区,所以客户端必须发送正确的日期(如果客户端来自新西兰 GTM +13,他需要发送下一个一天到服务器)。 webapp 使用时间戳(它只需要检查日期而不是时间),所以当我将日期转换为另一种格式以显示它或将其发送到服务器时,我需要添加时区。我尝试使用您的代码,您是对的,我不需要时刻时区,谢谢。但是 Android Chrome 的问题(仅在这种情况下)并没有消失。
    • 考虑使用moment的format函数,这样你就可以发回一个字符串。 ISO8601 通常是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多