在 JSON/Javascript 中表示一天中的时间的首选方法

Preferred way to represent time of day in JSON/Javascript?

本文关键字:时间 方法 表示 JSON Javascript 一天      更新时间:2023-09-26

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