在 JSON/Javascript 中表示一天中的时间的首选方法
Preferred way to represent time of day in JSON/Javascript?
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
- 指令加载真的很长,检查加载时间的方法
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- 在indexedDB中调用onupgradewneed方法的时间和原因
- 向 Firebase “push” 方法添加时间戳
- YQL推特时间线超出速率限制.解决方法
- 有没有一种方法可以在长时间运行的JavaScript操作之前强制回流
- 获取Web服务器时间并将其显示在网页上的正确方法
- 将时间戳转换为人类可读日期的简单方法
- 在 JSON/Javascript 中表示一天中的时间的首选方法
- 一种在指定时间后更改的背景图像之间添加更平滑过渡的简单方法
- 在固定的时间间隔后定期执行相同任务的不同方法
- 时间戳脚本,监视 C 列中的更改,在 E 列 [操作方法] 上设置时间戳
- 查找开始时间和结束时间数组之间的间隔的最佳方法是什么
- 在一段时间后自动调用 JavaScript 函数的正确方法是什么
- 使用周期性时间调用 Audioparam 方法
- 如何在页面中应用 JavaScript replace() 方法 2 时间
- 随着时间的推移,JavaScript 的 setInterval() 方法运行是否会消耗明显的处理能力
- 使用日期时间选择器 UI 选择在日期时间之后使用什么方法触发事件
- jQuery持续时间方法