2013-01-09 1 views
9

私はWebサービスからこの形式で日付と文字列を受け取る:コンバートYYYY-MM-DD T HH:MM:JavaScriptでのDateTimeにss.fffZ手動

yyyy-MM-ddTHH:mm:ss.fffZ 

私はJavaScriptにしてその文字列を変換する必要があります私はその変換をサポートしていない古いバージョンのJavaScriptを使用しているため、通常のDateTimeですが、新しいDate('yyyy-MM-ddTHH:mm:ss.fffZ')は使用していません。私は、その文字列を分割して取得することができます:

  • 時間

しかし、どの時間帯"fffZ"任意の提案を操作するには?

+1

JavaScriptの環境は何ですか? –

+3

'fffZ'はタイムゾーンではなく、タイムゾーンは' Z'([Zulu時間](http://en.wikipedia.org/wiki/Zulu_time)、UTCを意味します)、 'fff'は3つの小数です秒の部分( 'ss.fff')に属しています - 3つすべて一緒にすると、それらはミリ秒の部分を形成します。 – MvanGeest

+0

Android 2.3(PhoneGapとChildBrowserを使用) –

答えて

5

http://webcloud.se/log/JavaScript-and-ISO-8601/

Date.prototype.setISO8601 = function (string) { 
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + 
     "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" + 
     "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; 
    var d = string.match(new RegExp(regexp)); 

    var offset = 0; 
    var date = new Date(d[1], 0, 1); 

    if (d[3]) { date.setMonth(d[3] - 1); } 
    if (d[5]) { date.setDate(d[5]); } 
    if (d[7]) { date.setHours(d[7]); } 
    if (d[8]) { date.setMinutes(d[8]); } 
    if (d[10]) { date.setSeconds(d[10]); } 
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); } 
    if (d[14]) { 
     offset = (Number(d[16]) * 60) + Number(d[17]); 
     offset *= ((d[15] == '-') ? 1 : -1); 
    } 

    offset -= date.getTimezoneOffset(); 
    time = (Number(date) + (offset * 60 * 1000)); 
    this.setTime(Number(time)); 
} 
+0

どうやってこれを使うの? 'Date.setISO8601( '2010-01-02T00:00:01')'これは? – Bellash

0

このフォーム(ISO 8601wiki)の場合は、RegExpまたは文字列メソッドを使用して解析できます。次に、タイムゾーンZ,+hhまたは+hh:mmを使用できるようにするRegExpの例を示します。

var dateString = '2013-01-08T17:16:36.000Z'; 

var ISO_8601_re = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3}))?(Z|[\+-]\d{2}(?::\d{2})?)$/, 
    m = dateString .match(ISO_8601_re); 

var year = +m[1], 
    month = +m[2], 
    dayOfMonth = +m[3], 
    hour = +m[4], 
    minute = +m[5], 
    second = +m[6], 
    ms = +m[7], // +'' === 0 
    timezone = m[8]; 

if (timezone === 'Z') timezone = 0; 
else timezone = timezone.split(':'), timezone = +(timezone[0][0]+'1') * (60*(+timezone[0].slice(1)) + (+timezone[1] || 0)); 
// timezone is now minutes 

// your prefered way to construct 
var myDate = new Date(); 
myDate.setUTCFullYear(year); 
myDate.setUTCMonth(month - 1); 
myDate.setUTCDate(dayOfMonth); 
myDate.setUTCHours(hour); 
myDate.setUTCMinutes(minute + timezone); // timezone offset set here, after hours 
myDate.setUTCSeconds(second); 
myDate.setUTCMilliseconds(ms); 

console.log(myDate); // Tue Jan 08 2013 17:16:36 GMT+0000 (GMT Standard Time) 
+0

あなたは28日でそれを逃した... – kennebec

+1

@kennebec私はそれを見逃していない、私はちょうどコピーに失敗した正しいもの –

10

ここJohn Resigから1つのライナーです:私は解決策を設立しました

var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")), 
+0

'新しい日付(" 1987/02/28 23:11:81.333 ")'私に無効な日付 'を与える​​ –

+3

この答えは例が必要なので説明する必要があり、カンマで終わります。 –

-2

momentjsはこれに答えて、あなたが持つかもしれない他の多くの日付の問題を抱えているか確認してください。 必要な日付と希望する書式の両方をどこでどのように使用するのかは明確ではありませんが、私はmomentjsが必要なタスクをいくつか与えることができると思います モジュールを私のソリューションに追加し、 comのクラウドコード):

Parse.Cloud.define("momentFormat", function(request, response){ 
    var message; 

    var date = momento('2013-01-08T17:16:36.000Z'); 
    response.success("original format date: " + date.format("YYYY-MM-DDTHH:mm:ss.SSSZ") + " new format date: " + date.format("dddd, MMMM Do YYYY, h:mm:ss a")); 
}); 

出力:

{"result":"original format date: 2013-01-08T17:16:36.000+00:00 new format date: Tuesday, January 8th 2013, 5:16:36 pm"} 
+0

右....私はこれに答えるには速すぎた。確かにmomentjsはあなたの多くを助けることができます..しかし、yyyy-MM-ddTHH:mm:ss.fffZは完全には再調整されません。 fffの部分と関係がある....しかし、私の主なポイントは、あなたが多くの問題を克服することができるmomentjsを使用していることです。 – Chasky

関連する問題