Javascript日期到ISO格式的字符串(带时区)

时间:2017-04-11 09:23:52

标签: javascript date timezone

我一直在使用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"

3 个答案:

答案 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;
&#13;
&#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");
相关问题