【问题标题】:calculating time difference in iso time format in javascript?在javascript中计算iso时间格式的时差?
【发布时间】:2020-06-07 11:11:14
【问题描述】:

我有两个 ISO 格式的日期字符串。我正在使用矩 js 计算它们之间的分钟差。

var currenttime  =  new Date().toISOString();
var expiretime  = '2020-06-05T12:18:33.000Z';


let minutes = moment(expiretime, 'YYYY-MM-DD[T]HH:mm:ss. SSS[Z]').diff(moment(currenttime, 'YYYY-MM-DD[T]HH:mm:ss. SSS[Z]'), 'minutes');


console.log(minutes)

现在我有两个问题

  1. 这是计算分钟差的最佳方法吗?

  2. 当我运行new Date().toISOString() 时,z 之前的值应该是时区,但每次重新启动它都会改变?

请告诉我是什么问题?

【问题讨论】:

  • 如果您真的想要“ISO 时间格式的时差”,请参阅Create an ISO 8601 Duration in Javascript/Angular
  • 回复:“z 之前的值应该是时区,但每次重启时都会改变”,请注意 toISOString 始终是 UTC , Z 前面的位实际上是时间,Z 是时区偏移量,它代表 +00:00 或 UTC。如果您希望偏移量为 ±HHMM,请使用格式和 ZZ:moment().format('YYYY-MM-DDTHH:mm:ssZZ') 表示本地偏移量,或 moment().utc().format('YYYY-MM-DDTHH:mm:ssZZ') 表示 UTC。

标签: javascript node.js typescript datetime


【解决方案1】:

我认为您不必仅为此目的包含时刻,这可以在普通的 Javascript 中完成。 要计算时间差,只需减去两个时间戳,这将以毫秒为单位。然后除以60*1000,得到以分钟为单位的时差。

let currentTime = new Date();
let expireTime = new Date('2020-06-05T12:18:33.000Z');

let minutes = (expireTime - currentTime) / (1000 * 60);

console.log(minutes);

【讨论】:

  • 你能告诉我为什么 z 值会改变吗?还有时刻错了吗?
  • “z”值实际上是毫秒,而不是时区。 Z 表示祖鲁语,因此此表示中的日期始终采用 UTC。如果你想指定时区,你会在它之后写+04:30(或者你的时间偏移量)。
  • @Dennis——AIUI,“Z”是美国、英国、澳大利亚等多个国家使用的标准military timezone identifiers中GMT或UTC的标识符。名称“Zulu”来自拼音字母,其中“Z”被称为“祖鲁”。所以不是 Z 代表 Zulu,它实际上是相反的:Zulu 代表 Z。:-) PS 军事时区只有每小时增量,所以不包括一些偏移量或夏令时,所以 Z 是唯一一个共同点民用。 ISO 8601 也使用它。
  • @RobG 我知道这一点,但 OP 提出了不同的问题。他们问为什么“z值改变”,误解z之前的值实际上是毫秒,而时区值会在毫秒之后出现,或者用Z(祖鲁时间,相当于UTC)表示。
【解决方案2】:

对于您的第一个问题,您可以做的只是减去两个日期(日期对象而不是字符串),

较新的日期 - 较旧的日期(这将以毫秒为单位给出结果)

或使用 Math.abs() 函数计算毫秒 -

var msec = Math.abs( currenttime - expiretime );

并使用 -

将其转换为分钟
var min = Math.floor((msec/1000)/60);

2) datetime 字符串中的 Z 代表 Zulu,表示时间为 UTC 格式。 您可以简单地减去两个日期对象。

var currenttime = new Date();
var currenttime_UTC = currenttime.getUTCDate();
var expiretime = new Date('2020-06-05T12:18:33.000Z');

var msec = Math.abs( currenttime_UTC - expiretime );
var min = Math.floor((msec/1000)/60);

【讨论】:

  • 不,moment 也可以,但是如果你只是为了这个目的使用它,那么上面 2 cmets 中的代码就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2023-03-10
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多