簡體   English   中英

Javascript 日期到 ISO 格式的字符串(帶時區)

[英]Javascript Date to string with ISO format (with timezone)

我一直在使用 MomentJS,但我正在開始一個新項目,我不想包含這個庫,因為我只玩過幾次日期。

所以我想要做的是以類似 ISO 的格式('YYYY-MM-DDZHH:mm:ss' 或 'YYYY-MM-DD HH:mm:ss')獲取日期的字符串表示。 我不希望在 UTC 中使用它:我希望在給定的時區中使用它(我可以以編程方式提供)。

例如,現在的表示將是“2017-04-11 11:20:00”(法國時區 - 相當於“2017-04-11 09:22:00Z”。)

我想要原生 Javascript。 我一直在玩toLocaleString沒有成功。

謝謝

[編輯] 在一個完美的世界中,我正在尋找一個接受日期格式、時區並返回我想要的字符串的函數。 喜歡:

function magicDateFormatter(format, tz) {
  /* ... */
}

var now = new Date();
console.log(magicDateFormatter('YYYY-MM-DD HH:mm:ss', 'Europe/Paris'));
// print "2017-04-11 11:20:00"

像這樣的事情可能對你有用:

function formatDateWithZone(date, tz) {
    var s = date.toLocaleString('en-GB', { timeZone: tz });
    var a = s.split(/\D/);
    return a[2] + '-' + a[1] + '-' + a[0] + ' ' + a[4] + ':' + a[5] + ':' + a[6];
}

用法:

formatDateWithZone(new Date(), 'Europe/Paris')  // "2017-04-12 03:37:59"

這將適用於通過 ECMA-402 實現時區支持的環境。 此處的兼容性表將通過展開DateTimeFormat部分並查看標記為accepts IANA timezone names的行,向您展示哪些支持它們。

您可能需要這樣的東西:首先根據需要格式化時間戳,包括時區偏移,然后根據需要更改數字項的位置,使用正則表達式使用替換函數:

const timeStamp = new Date().toLocaleString('de-DE', {
                    timeZone: 'Europe/Berlin',
                    hour12: false,
                    year: "numeric",
                    month: "2-digit",
                    day: "2-digit",
                    hour: "2-digit",
                    minute: "2-digit",
                    second: "2-digit",
                }).replace(/(\d+)\.(\d+)\.(\d+),\s(\d+):(\d+):(\d+)/, "$3$2$1_$4$5$6");

您無法使用內置方法執行您所要求的操作,因為 ECMAScript 實現不需要存儲所有(甚至任何)時區的歷史數據。 他們只需要訪問主機的當前時區偏移量。

此外,ECMA-402 國際化 API 也不夠。 雖然它允許指定時區,但並非所有實現都支持 ECMA-402 和那些支持的實現,並非所有實現都支持“UTC”以外的時區值(這是唯一一個 ECMA-402 需要支持的,其他是可選的) . 並且僅使用 ECMA-402 很難甚至不可能准確指定格式。

我認為你最好使用像 moment.js 這樣的現有庫和 Moment-timezone.js。 相對於網頁的一般大小(至少最近似乎是 1MB),下載量並不大。 如果你嘗試自己寫一些東西,無論如何你最終都會得到一些非常瞬間的東西。

為了減少下載的大小,您可以只獲取 2012 年到 2022 年的時區數據。

如果你想使用你的簡化調用,那么一個小的magicDateFormatter可以利用 moment.js 的東西:

 /* Return date string for a date in the required timezone and format ** @param {string} timezone: IANA time zone designator, eg Asia/Sakhalin ** @param {Date} [date] : date to use, default is current date ** @param {string} [format]: output format using Moment.js tokens, ** default is 'YYYY-MM-DDTHH:mm:ssZZ' ** @returns {string} : formatted string ** ** magicDateFormatter(timezone[, date[, format]]) */ function magicDateFormatter(timezone, date, format) { // Validate that the time zone is supported if (!moment.tz.zone(timezone)) { return 'Unknown time zone: "' + timezone + '"'; } // Use current date if not supplied date = date || new Date(); // Use default format if not supplied format = format || 'YYYY-MM-DDTHH:mm:ssZZ' return moment(date).tz(timezone).format(format) } console.log(magicDateFormatter('Europe/Paris')); console.log(magicDateFormatter('Asia/Sakhalin', new Date(2016,1,29), 'Do MMMM, YYYY')); console.log(magicDateFormatter('foo/bar'));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.min.js"></script>

當然,如果需要,您也可以在調用中指定格式。

暫無
暫無

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

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