2017-04-11 194 views
0

我一直在使用MomentJS很多,但我開始一個新的項目,我不想包括這個庫,因爲我只玩日期幾次。Javascript日期到ISO格式字符串(帶時區)

所以我想要做的是以類似ISO的格式('YYYY-MM-DDZHH:mm:ss'或'YYYY-MM-DD HH:mm: SS')。我不希望它在UTC:我希望它在給定的時區(我可以提供編程方式)。

例如,對於現在的表現將是 「2017年4月11日11時二十分零零秒」(法語時區 - EQ爲 「2017年4月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" 
+0

爲什麼你不想包含一些會讓你離開的問題? – evolutionxbox

+0

因爲爲幾個操作加載一個庫是過量的 –

+0

取決於您嘗試實施這些「幾個方法」所創建的技術債務的數量。如果你不想要一個圖書館,爲什麼不在一個提取物裏面只看你想要的東西? – evolutionxbox

回答

0

你不能做你使用內置方法是ECMAScript實現不要求存儲所有的歷史數據(甚至任何)時區問。它們只需要訪問主機當前的時區偏移量。

此外,ECMA-402國際化API也不夠。雖然它允許指定時區,但並非所有的實現都支持ECMA-402和那些支持ECMA-402的實現,但並非所有支持時區的值都不是「UTC」(這是ECMA-402唯一需要支持的其他支持時區) 。要僅使用ECMA-402指定格式是非常困難的。

我認爲使用像moment.js這樣的現有庫可以更好地使用Moment-timezone.js。相對於網頁的一般大小(最近似乎至少爲1MB),下載量並不那麼大。如果你想自己寫點東西,那麼最終你會得到非常時刻的東西 - 就像反正一樣。

爲了減少下載的大小,如果你想使用你的簡化呼叫,然後小magicDateFormatter可以利用moment.js,你可以得到的只是2012年的時間段數據,以2022年

東東:

/* Return date string for a date in the required timezone and format 
 
** @param {string} timezone: IANA time zone designator, e.g. 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>

當然你也可以指定呼叫的格式,如果你想要的。

+0

ECMA-402確實具有時區支持,現在大多數新的瀏覽器都可以使用它。 –

+0

@ MattJohnson-很好的瞭解,但[* ECMA-402 *](https://www.ecma-international.org/ecma-402/1.0/#sec-12.1.1.1)仍然是UTC,可選擇支持對於其他時區。 Firefox 38支持ECMA-402,但忽略除「UTC」以外的時區選項。對於準確指定格式也是不實際的。 – RobG

0

像這樣的事情可能會爲你工作:

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時區支持的環境中工作。兼容性表here將通過展開DateTimeFormat部分並查看標記爲accepts IANA timezone names的行來向您顯示支持它們的信息。

+0

但並非所有已實施ECMA-402的瀏覽器都爲UTC以外的值實施了時區選項。對於上述情況,Firefox 38返回「RangeError:無效時區」。另外,對於上述情況,IE 10的* toLocaleString *返回格式爲「DDDD,d MMMM YYYY h:mm:ss A」的字符串(使用moment.js標記),所以重新格式化也不起作用。 :-( – RobG