我一直在使用MomentJS,但是我开始了一个新项目并且我不想包含这个库,因为我只玩了几次日期。
所以我要做的就是以类似ISO的格式获取日期的字符串表示形式(' YYYY-MM-DDZHH:mm:ss'或' YYYY-MM-DD HH:mm:ss')。我不想在UTC中使用它:我希望它在给定的时区(我可以以编程方式提供)。
例如,现在的代表将是" 2017-04-11 11:20:00" (法语时区 - eq to" 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"
答案 0 :(得分:1)
这样的事可能适合你:
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
的行来向您显示支持它们。
答案 1 :(得分:0)
您无法使用内置方法执行您所要求的操作,因为不需要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, 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>
&#13;
当然,如果需要,您也可以在通话中指定格式。
答案 2 :(得分:0)
您可能需要这样的东西: 首先根据需要格式化时间戳,包括时区偏移量,然后根据需要更改数字项的位置,并使用regex替换功能:
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");