2017-04-11 198 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