需要从phonegap的navigator.globalization.dateToString返回日期/时间字符串

时间:2013-06-16 15:27:09

标签: javascript asynchronous cordova

我正在使用Cordova / Phonegap进行跨平台应用程序,我需要格式化从AJAX调用返回的JSON日期。

日期存储为UTC,我需要为当地时区格式化日期。所以似乎cordova的navigator.globalization.dateToString符合要求。但是,我正在构建一个更大的数据字符串,所以我无法处理回调中的完整作业。我需要在字符串中获取格式化的日期/时间并在以后使用它。

   var myTime = new Date(parseInt(myData.StartTime.substr(6)));  // get a date object

    var myTimeString = '';
    console.log("before");
    navigator.globalization.dateToString(myTime,
            function(date)
            {
            console.log("doing");
            myTimeString = date.value;
        },
            function()
            {
            alert('Error getting dateString\n');
             },
             {
                  formatLength : 'short',
                  selector : 'date and time'
             });
    console.log("done");
    console.log(myTimeString);    // the problem is that this is not necessary set.

对于Android,上面的代码产生: 之前 干 DONE

对于iOS,上面的代码会产生: 之前 DONE 做

我认为问题在于匿名函数是异步的,在console.log()执行时可能会也可能不会设置。

是否有一种普遍接受的解决此时间问题的方法?或者有更好的方法来获得我想要/需要的东西吗?

--- --- EDIT

根据以下内容,我意识到我提出了错误的问题。

首先,我重构了我的代码,以便可以从处理函数处理输出。谢谢你指出这一点。它更清洁。

但是,我需要在循环中执行此操作,并且需要跟踪我正在使用的迭代。

for(var i = 0; i < 5; i++)
{
    var myTime = new Date(parseInt(myData.StartTime.substr(6)));  // get a date object
    navigator.globalization.dateToString(myTime, 
          function(date) {
            myTimeString = "my date is: " +date.value  +" my iterator is: "+i;
            console.log(myTimeString);
          },
          function() { alert('Error getting dateString\n'); },
          {
            formatLength : 'short',
            selector : 'date and time'
           });
}

在android中,我得到像

这样的东西
  • 我的日期是:某个日期我的迭代器是:0
  • 我的约会对象是:我的迭代器的日期是:1
  • 我的约会对象是:我的迭代器的日期是:2
  • 我的日期是:我的迭代器的日期是:3
  • 我的日期是:我的迭代器的日期是:4

在iOS中,我得到了

  • 我的约会对象是:我的迭代器的日期是:5
  • 我的约会对象是:我的迭代器的日期是:5
  • 我的约会对象是:我的迭代器的日期是:5
  • 我的约会对象是:我的迭代器的日期是:5
  • 我的约会对象是:我的迭代器的日期是:5

我希望能够做到前一个例子,我错过了什么?

1 个答案:

答案 0 :(得分:0)

是的,这是一个异步调用,所以你需要在回调函数中继续你的进程:

var myTime = new Date(parseInt(myData.StartTime.substr(6)));  // get a date object

var myTimeString = '';
console.log("before");
navigator.globalization.dateToString(myTime,
        function(date)
        {
           console.log("doing");
           myTimeString = date.value;
           callback(myTimeString);
        },
        function()
        {
            alert('Error getting dateString\n');
        },
        {
          formatLength : 'short',
          selector : 'date and time'
        });

function callback(myTime)
{
    console.log("done");
    console.log(myTime);
}