Sjoerd de Wit
Sjoerd de Wit

Reputation: 2413

Date on iOS device returns NaN

i'm currently developing a cordova web based application with ionic and angularjs. now i've created a service that returns a formatted time the way my client wants it.. the problem with this is that whilst it works on android and in browser, it displays NaN on an iOS device. The date i insert is from a database in timestamp : NOW() format, is there a fix for this? this is my date service:

.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;
  }
}]);

Upvotes: 10

Views: 28998

Answers (4)

Hung Tran
Hung Tran

Reputation: 141

This may work for you

var actiondate = new Date(date.replace(" ", "T"));

Upvotes: 0

Key Shang
Key Shang

Reputation: 917

The reason of the problem is iPhone Safari doesn't support the Y-m-d H:i:s (ISO 8601) date format. I have encountered this problem in 2017/7/19, I do not understand why Safari did not fix the problem after two years.

I refer to the answer of Sjoerd, thanks Sjoerd, just rewrite it to a function to do the date conversion when you have many date need to be processed. After you get a date(must be Y-m-d H:i:s format) from server, you could use the function convert the date to the format which iOS device could resolve and other browsers could resolve too.

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;
}

I encountered the problem when I write ajax for date, hope the solution will help others encountered the annoying problem.

Upvotes: 13

Zeeshan Ahmed
Zeeshan Ahmed

Reputation: 15

install momentjs to by
npm install moment --save

intitilize the new date with
var date = moment(yourDate).format()
var formatedDate = new data(date)

hope this resolve the issue

Upvotes: -3

Sjoerd de Wit
Sjoerd de Wit

Reputation: 2413

Fixed this thanks to @Ian his comment ,

changed this:

var actiondate = new Date(date);

to this:

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);

Upvotes: 29

Related Questions