【问题标题】:Date time difference in moment.jsmoment.js 中的日期时间差
【发布时间】:2015-03-10 20:56:10
【问题描述】:
  • 将值设置到本地存储中:

    $scope.SetLocalStorage('My-' + $rootScope.UserId, moment()); 
    
  • 从本地存储中获取值:

    var dt = moment($scope.GetLocalStorage('My-' + $rootScope.UserId));
    
  • 从本地存储中获取日期时间:

    var dTime = moment(dt);
    

这里显示无效日期:

我需要小时的时差:

var timeDifference = moment().diff(moment(dTime)), 'hours');

问题:'timeDifference' 总是给出 Nan

你能告诉我为什么吗?任何帮助将不胜感激。

我使用过的库:Local-storagemoment.js

【问题讨论】:

  • 我猜,$scope.GetLocalStorage('My-' + $rootScope.UserId) 是你的 moment() 是当前时间,为什么你有 moment('current time'),然后又时刻(momet('当前时间'))?
  • @Nielarshi 我需要将当前日期时间存储到本地存储和以后的时间我现在需要在哪里检查存储值和日期时间的差异?
  • 我认为“'My-' + $rootScope.UserId”(用于存储在本地存储中的密钥)有问题。我没有看到你正在做的任何错误。通过给出一些字符串键来检查,而不是从 rootScope 获取。
  • var dTime = moment(dt); // 不是必需的,var timeDifference = moment().diff(moment(dTime)), 'hours'); // 这也不是必需的。只要你做 var timeDifference = moment().diff(dt), 'hours');

标签: javascript angularjs local-storage momentjs


【解决方案1】:

这里的问题是,当使用这种方式时,moment() 返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数(与 new Date().getTime() 相同)。所以现在你有一个数字,你将它存储在本地存储中,将它变成一个字符串。

当您随后构造一个新的 moment(someString) 对象时,它会回退到使用 Date 进行构造,因为您向它传递了一个字符串(它需要一个 ISO 8601 格式的字符串),所以它具有特定的行为,这在您的情况下失败。

正确的方法是将正确的表示存储在本地存储中(您可以使用.format() 获取)。您可以将其余代码保持不变。

$scope.SetLocalStorage('My-' + $rootScope.UserId, moment().format());

编辑: 这(几乎)与 R3tep 建议的使用 JSON.stringify(moment()) 相同。这两种解决方案都会将当前时间转换为 ISO 8601 表示,以便将其正确存储为字符串,以便您可以使用其中任何一种。

【讨论】:

  • 非常感谢您的冗长解释。
【解决方案2】:

moment() 返回一个对象,本地存储不接受对象。在存储值之前解析成字符串

$scope.SetLocalStorage('My-' + $rootScope.UserId, JSON.stringify(moment())); 

当你使用它时,请使用JSON.parse

var dt = moment(JSON.parse($scope.GetLocalStorage('My-' + $rootScope.UserId)));

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2014-02-13
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多