我正在使用 Moment.js 来处理我的 Web 应用程序中的日期。服务器以 UTC 毫秒为单位返回所有日期。现在,我必须显示应用特定时区的日期(基于用户设置)。
有什么方法可以全局设置时区,而不是更改所有对 momentjs 的调用来处理它?
我正在使用 Moment.js 来处理我的 Web 应用程序中的日期。服务器以 UTC 毫秒为单位返回所有日期。现在,我必须显示应用特定时区的日期(基于用户设置)。
有什么方法可以全局设置时区,而不是更改所有对 momentjs 的调用来处理它?
您可以使用以下方法在 Moment 中设置默认时区:
moment.tz.setDefault(String);
moment.tz.setDefault("America/New_York");
npm install moment-timezone
var moment = require('moment-timezone');
并使用这个对象而不是通常的moment
。moment.tz.setDefault(String);
其中 String 是时区标识符。例如:
var moment = require('moment-timezone');
moment.tz.setDefault("America/New_York");
使用同一网站上的 moment-timezone 库:http: //momentjs.com/timezone/ 它让您可以执行以下操作:
moment(utcDateTime).tz(settings.timezone).format(settings.dateFormat);
我建议实现一个用户类/对象,它具有将 UTC 转换为用户时区的服务功能。看看这个小提琴:
http://jsfiddle.net/guidosch/ofd4unhu/4/
日期以 UTC 形式提供,但视图使用用户类的日期格式化方法来根据用户的喜好调整和格式化 UTC 日期。
过去遇到过这个问题,我的解决方案是创建一个时刻工厂,从基本配置中配置时刻对象。您可以使其像需要时刻一样透明 - 引用您的包并使用类,就像时刻一样 - 但实际上您正在调用一个时刻包装器对象,该对象使用选定的时区来提供时刻实现。
我没有进行广泛的测试,但在粗略的测试中看起来是正确的。我能够使用 Moment Timezone 0.0.1 做到这一点:
var serverTimezoneOffset = <?php echo timezone_offset_get(new DateTimeZone(date_default_timezone_get()), new DateTime('now')) / -60; ?>;
moment.updateOffset(new Date().getTimezoneOffset()-serverTimezoneOffset);