2009-01-12 61 views
1

我當前正在使用的datetime microformat顯示時間戳的頁面,但我只顯示了人類可讀的時間爲我自己的時區:如何將datetime微格式轉換爲javascript中的本地時間?

<abbr class="published" title="2009-01-09T09:16:00-05:00"> 
Friday, January 9, 2009 at 9:16 am (EST)</abbr> 

我希望做的是重寫abbr標籤的innerHTML是相同的格式,但在用戶的本地時區中。因此,對於在西雅圖讀者,上面應轉換爲:

<abbr class="published" title="2009-01-09T09:16:00-05:00"> 
Friday, January 9, 2009 at 6:16 am (PST)</abbr> 

我已經看過了Javascript Date object,這讓我得到了當地時區偏移。但是,我有幾個問題:

  1. 我沒有看到一個簡單的方法來創建從ISO-8601時間戳的新Date對象。 (我想我可以解析子字符串或正則表達式,如果沒有更快的方法。)

  2. 我看不到一種方法來獲取時區的指定縮寫。例如,對於西雅圖的讀者,我希望有時間在末尾附加「(PST)」,否則該用戶不清楚時間戳已被轉換(特別是如果他是一個常客和已經習慣了我的時代是在EST的事實)。

回答

5

這裏是我的代碼解析的ISO時間戳:

function isoDateStringToDate (datestr) { 
    if (! this.re) { 
    // The date in YYYY-MM-DD or YYYYMMDD format 
    var datere = "(\\d{4})-?(\\d{2})-?(\\d{2})"; 
    // The time in HH:MM:SS[.uuuu] or HHMMSS[.uuuu] format 
    var timere = "(\\d{2}):?(\\d{2}):?(\\d{2}(?:\\.\\d+)?)"; 
    // The timezone as Z or in +HH[:MM] or -HH[:MM] format 
    var tzre = "(Z|(?:\\+|-)\\d{2}(?:\\:\\d{2})?)?"; 
    this.re = new RegExp("^" + datere + "[ T]" + timere + tzre + "$"); 
    } 

    var matches = this.re.exec(datestr); 
    if (! matches) 
    return null; 

    var year = matches[1]; 
    var month = matches[2] - 1; 
    var day = matches[3]; 
    var hour = matches[4]; 
    var minute = matches[5]; 
    var second = Math.floor(matches[6]); 
    var ms = matches[6] - second; 
    var tz = matches[7]; 
    var ms = 0; 
    var offset = 0; 

    if (tz && tz != "Z") { 
    var tzmatches = tz.match(/^(\+|-)(\d{2})(\:(\d{2}))$/); 
    if (tzmatches) { 
     offset = Number(tzmatches[2]) * 60 + Number(tzmatches[4]); 
     if (tzmatches[1] == "-") 
     offset = -offset; 
    } 
    } 

    offset *= 60 * 1000; 
    var dateval = Date.UTC(year, month, day, hour, minute, second, ms) - offset; 

    return new Date(dateval); 
} 

不幸的是,它不會自行處理時區的縮寫。你將不得不修改「tzre」表達式來接受字母,我知道的唯一解決Javascript中的時區縮寫的解決方案是有一個查找表,您可以在發生區域更改時手動更新夏令時。

+0

您連續兩次使用變量「ms」,使其以前的使用無效。 – 2013-06-09 02:33:55

0

EcmaScript將一個ISO-8601樣式字符串的形式正式化爲JavaScript日期的輸入。由於大多數JS實現不支持這一點,我創建了一個包含Date對象的包裝,它具有這種功能。如果將標題標籤設置爲以UTC/GMT/Z /祖魯偏移量輸出,則可以使用我的EcmaScript 5 extensions for JS's Date object

對於要在客戶端腳本中使用的DateTime值,我通常會嘗試始終執行以下操作。將日期和時間存儲在UTC區域(即使在數據庫中)。在UTC區域傳輸日期時間。從客戶端到服務器,您可以在上面的鏈接中使用.toISOString()方法。從服務器到客戶端,這相對容易。

通過jQuery(擴展):

$('.published').each(function(){ 
    var dtm = new Date(this.title); 
    if (!isNaN(dtm)) { 
    this.text(dtm.toString()); 
    } 
});

我不記得我是否添加了輸入非UTC日期時間的支持,但不會太難解釋它們。

相關問題