Javascript 附带了 Date 对象,提供了几个用于处理特定时间点的实用程序。
但是,如果我想表示一天中的某个时间,例如仅表示任何一天中的一个点,而不是与特定日期相关联的15:00
,该怎么办?
我知道我可以使用字符串,但是对于此类数据,是否有更标准化的表示形式?
根据您想要的粒度,您可以使用秒或毫秒。所以:
var time = 900; // 900 seconds = 15:00
然后在你的 JavaScript 中,你可以像这样在今天的日期中实例化那个时间:
// get the current date and time
var date = new Date();
// reset the hours, mins, seconds, ms
date.setHours(0, 0, 0, 0);
// set according to the stored time
date.setSeconds(time);
为了回答更标准化的方法:大多数计算机使用Unix时间戳,它计算从1970年1月1日UTC开始的毫秒数。但是,正如您已经说过的,日期对您来说并不重要。
无论日/月/年的重要性如何 - 使用秒或毫秒是将数据恢复回公共JavaScript Date对象的好方法,这在应用程序级别非常有用。
对于大量的过度考虑和句法糖,您可能会发现 Moment 有用,也可能不会。
var time = 900;
// get the current date and time
var date = new Date();
// reset the hours, mins, seconds, ms
date.setHours(0, 0, 0, 0);
// set according to the stored time
date.setSeconds(time);
document.body.innerHTML = date;
我认为没有标准的方式来做你需要的事情,但我会做一些类似于以下示例的事情。这个想法是,我们将日期对象用于时间部分,而忽略其他所有内容。
function time(str) {
var date = '1970-01-01 {hr:min}:00';
var _time = new Date(date.replace('{hr:min}', str));
return {
getHours: function() {
return _time.getHours();
},
getMinutes: function() {
return _time.getMinutes();
},
getSeconds: function() {
return _time.getSeconds();
},
toString: function() {
return _time.toLocaleTimeString(); // or use `toTimeString()`
}
};
}
用法:
var t = time('15:30');
var t2 = time('11:45');
t.getHours(); //=> 15
t.getMinutes(); //=> 30
t.getSeconds(); //=> 0
// We're getting AM and PM for free
t.toString(); //=> "3:30:00 PM"
t2.toString(); //=> "11:45:00 AM"
更新:
上面的示例不使用原型,因此每个对象都会获得这些方法的副本。如果要有很多对象,则可能需要使用以下版本,该版本使用原型。此版本的缺点是它公开了 this._time
属性。
var time = (function() {
var date = '1970-01-01 {hr:min}:00';
var methods = {
getHours: function() {
return this._time.getHours();
},
getMinutes: function() {
return this._time.getMinutes();
},
getSeconds: function() {
return this._time.getSeconds();
},
toString: function() {
return this._time.toLocaleTimeString(); // or use `toTimeString()`
}
};
return function(str) {
var _instance = Object.create(methods);
_instance._time = new Date(date.replace('{hr:min}', str));
return _instance;
};
}());
var t = time('15:30');
var t2 = time('11:45');
我最近也在研究这个问题,因为我也想在 JS 中表示独立于日期的时间。
我搜索了一个标准解决方案,但很快发现没有。唯一接近的是使用 Date
并且只在其上设置时间属性,如 @shennan 所建议的那样。但这感觉是错误的,因为它暴露了与白天无关的方法,比如getFullYear()
,如果它在程序中传递,会让人们感到困惑。
另一种选择是使用一些日期时间库,但引入它来表示一个简单的时间也感觉不对,因为这些库在大小和 API 方面通常很重。
我认为@istos采用的方法 - 仅公开与时间相关的方法并使用日期作为核心 - 是最好的。但是,它有一个小问题,如果您使用日期进行计算并且超出 UTC+0 时区,它会给您不正确的结果,那就是 getHours()
的使用 .此方法为您提供本地化的小时计数,当您减去例如时会扭曲结果。 从 4:00
2:00
,因此您希望改用 getUTCHours()
,这将返回相对于 UTC+0 的小时计数。
所以这是一个现代的,内存高效的解决方案(通过使用class
,每个实例都引用一个公共原型的方法),它允许计算,因为它既公开又允许使用毫秒(使用TypeScript)创建自身:
class Time {
private date: Date
constructor(...args: [number] | [number, number]) {
if (args.length === 1) {
this.date = new Date(args[0])
} else {
const hours = args[0]
const minutes = args[1]
this.date = new Date(Date.UTC(1970, 0, 1, hours, minutes))
}
}
getHours() {
return this.date.getUTCHours()
}
getMinutes() {
return this.date.getUTCMinutes()
}
getTime() {
return this.date.getTime()
}
toString() {
return `${padWithZero(this.getHours())}:${padWithZero(this.getMinutes())}`
}
}
const t1 = new Time(4, 30)
const t2 = new Time(1, 15)
const t3 = new Time(t1.getTime() - t2.getTime())
t3.getHours() // 3
t3.getMinutes() // 15