【问题标题】:Using Moment.JS to calculate difference between two dates in different formats使用 Moment.JS 计算不同格式的两个日期之间的差异
【发布时间】:2021-12-06 18:38:18
【问题描述】:

我正在使用 moment.js 来计算 Qualtrics 中两个日期之间的差异。到目前为止,下面的代码运行良好。日期使用 YY-mm-dd 格式,最后,我得到了天数的差异。

const duedate= Qualtrics.SurveyEngine.getEmbeddedData('duedate');
const daystodue = moment(duedate).diff(moment(new Date()), 'days', false);
Qualtrics.SurveyEngine.setEmbeddedData('daystill', daystodue );

问题是当我将嵌入数据 'duedate' 的格式从 YY-mm-dd 更改为 ISO 8601(例如,2021-10-19T20:30:48Z)时,这将停止工作。

我知道我可能还需要将 new Date() 的格式更改为 ISO,或者将 'duedate' 重新格式化回 YY-mm-dd,但我正在努力解决这个问题。这是我尝试过的:

const duedate= Qualtrics.SurveyEngine.getEmbeddedData('duedate');
const daystodue = moment(duedate).diff(moment(new Date().format("YYYY-MM- 
DDTHH:mm:ssZ")), 'days', false);
Qualtrics.SurveyEngine.setEmbeddedData('daystill', daystodue );

我以 this article 为基础,但我是 JavaScript 的初学者,不知道如何使它工作。

非常感谢任何帮助!

【问题讨论】:

  • 如果 duedate 是一个 ISO 8601 编码的字符串,您应该能够从中创建一个 JavaScript Date 对象(例如 new Date(duedate))。你试过吗?
  • 使用 moment.js 解析字符串时,您应该始终提供格式unless it's an ISO format

标签: javascript date momentjs


【解决方案1】:

moment.js 非常聪明,可以理解两种不同的格式并使用这些日期进行操作。我已经尝试过了,它可以工作:

const dueDate = '2021-10-19T20:30:48Z'
const firstDayOfYear = '2021-01-01'
moment(dueDate).diff(moment(firstDayOfYear), 'days', false)

返回 291

注意:我使用的是 Moment.js v2.29.1

【讨论】:

  • 非常感谢您 - 我根据您的洞察力想通了!
  • “我已经尝试过了,它有效”不是一个好的建议。默认情况下,moment.js 将解析 ISO 8601 格式的时间戳。如果提供了任何其他格式而没有提供格式字符串,则会将其提供给内置解析器进行解析(参见Why does Date.parse give incorrect results?)。
  • 好的@RobG,感谢您的建议。我会把它作为我的下一个答案。
【解决方案2】:

我最终把它放在一起,这很有效:

const duedate= Qualtrics.SurveyEngine.getEmbeddedData('duedate');
const today= new Date( );
const daystodue= moment(duedate).diff(moment(today), 'days', false);
Qualtrics.SurveyEngine.setEmbeddedData('daystill', daystodue);

感谢大家的见解!

【讨论】:

  • 请注意,您不需要执行const today = new Date(); moment(today);,只需使用moment() 即可为当前日期和时间创建一个Moment 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多