【问题标题】:Date on iOS device returns NaNiOS 设备上的日期返回 NaN
【发布时间】:2014-10-30 15:40:17
【问题描述】:

我目前正在使用 ionic 和 angularjs 开发一个基于 Cordova Web 的应用程序。现在我创建了一个服务,它以我的客户想要的方式返回格式化时间。问题是,虽然它可以在 android 和浏览器上运行,但它在 iOS 设备上显示 NaN。我插入的日期来自时间戳:NOW() 格式的数据库,有解决办法吗? 这是我的约会服务:

.factory('displaydate',['$filter', function($filter) {
  return function (date){
    var maandarray = new Array('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'); 
    var actiondate = new Date(date);
    var today = new Date();
    if(today.getDate() == actiondate.getDate()){
        var hourssince =   today.getHours() - actiondate.getHours()
        var minutessince =   today.getMinutes() - actiondate.getMinutes()
        var secondssince =   today.getSeconds() - actiondate.getSeconds()
        if(hourssince > 0){
            date = hourssince+'u';
        }else if(minutessince > 0){
            date = minutessince+'m';
        }else{
            date = secondssince+'s';
        }
    }else{
        var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
        var diffDays = Math.round(Math.abs((today.getTime() - actiondate.getTime())/(oneDay)));
        if(diffDays > 28){
            var identifier = actiondate.getMonth() - 1;
            var month = maandarray[identifier];
            date = $filter('date')(actiondate,"d ") + month +  $filter('date')(actiondate," yy " + " HH:" + "mm");
        }else{ 
            date = diffDays+'d';
        }
    }
    return date;
  }
}]);

【问题讨论】:

  • 这可能意味着您开始使用的“日期”字符串在 iOS 中不被理解为有效的日期格式。如果您使用不可解析的字符串构造 Date 实例,则所有 API 都会返回 NaN
  • 您应该以标准格式 (ISO) 格式化字符串,我很确定它会起作用
  • 这是一个直接来自数据库的mysql时间戳NOW()格式字符串
  • @SjoerdDeWit 生成的日期时间接近 ISO8601,但不完全一致。如果希望在所有浏览器中都能正确解析,需要格式化,或者自己解析(或者用库)
  • 感谢@Ian 格式化它确实修复了它。

标签: javascript angularjs datetime webkit


【解决方案1】:

感谢@Ian 他的评论解决了这个问题,

改变了这个:

var actiondate = new Date(date);

到这里:

var t = date.split(/[- :]/);

// Apply each element to the Date function
var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]);
var actiondate = new Date(d);

【讨论】:

  • 非常感谢,对于 json 日期格式 var t = date.split(/[- : T]/); 并且不要忘记为数组的每个元素解析 parseInt() new Date(parseInt(t[0]), parse...
  • 感谢 Sjoerd!举行!
【解决方案2】:

问题的原因是 iPhone Safari 不支持 Y-m-d H:i:s (ISO 8601) 日期格式。我在 2017/7/19 遇到过这个问题,我不明白为什么 Safari 两年后没有修复这个问题。

我参考了Sjoerd的答案,谢谢Sjoerd,当你有很多日期需要处理时,只需将其重写为一个函数来进行日期转换。从服务器获取日期(必须是Y-m-d H:i:s格式)后,您可以使用该功能将日期转换为iOS设备可以解析的格式,其他浏览器也可以解析。

function convertDateForIos(date) {
    var arr = date.split(/[- :]/);
    date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
    return date;
}

我在为日期写ajax时遇到了问题,希望解决方案能帮助其他人遇到烦人的问题。

【讨论】:

  • 我不断收到错误消息“date.split 不是函数”...知道为什么吗?
  • @CJBroersma 可能是您的date 不是有效的Y-m-d H:i:s (ISO 8601) 日期格式。检查它并格式化date
  • 哦,谢谢,我错过了一些确实改变它的服务器端代码。感谢伟大的功能。
【解决方案3】:

通过
npm install moment --save

安装 momentjs


初始化新日期 var date = moment(yourDate).format()
var formatedDate = 新数据(日期)

希望这能解决问题

【讨论】:

猜你喜欢
  • 2021-09-15
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多