簡體   English   中英

如何在JavaScript中將日期時間微格式轉換為本地時間?

[英]How can I convert datetime microformat to local time in javascript?

我有一個頁面當前正在使用datetime微格式顯示時間戳,但是我只是在顯示自己時區的人類可讀時間:

<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對象 ,它使我能夠獲取本地時區偏移量。 但是我有一些問題:

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

  2. 我沒有找到獲取時區命名縮寫的方法。 例如,對於西雅圖的讀者,我希望在時間末尾附加“(PST)”,否則該用戶不清楚時間戳是否已轉換(尤其是如果他是常客和我已經習慣了我的時代在美國東部標准時間(EST)。

這是解析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中時區縮寫的唯一解決方案是擁有一個查找表,如果更改了區域,則手動更新該查找表夏令時。

EcmaScript正式添加了ISO-8601樣式字符串,作為JavaScript日期的輸入。 由於大多數JS實現都不支持此功能,因此我創建了具有此功能的Date對象的包裝。 如果將標題標簽設置為以UTC / GMT / Z / Zulu偏移量輸出,則可以將我的EcmaScript 5擴展名用於JS的Date對象

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

通過jQuery(帶有擴展名):

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

我不記得我是否在輸入中添加了對非UTC日期時間的支持,但是考慮到它們並不難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM