javascript - 向 Javascript 日期添加时间

标签 javascript angular

我正在尝试在 Angular 应用程序中添加时间到日期。

我有一个日期选择器 (appointmentDate),它返回 Javascript 日期和一个选择框,其中的时间 (appointmentTime) 具有以下值:

"8:00"
"8:30"
"9:00"

等等

我不确定如何创建具有正确时间的日期对象。

我可以执行以下操作来创建时间为 00:30 的日期:

var s = new Date(this.appointmentForm.controls.appointmentDate.value);
s.setMinutes(s.getMinutes()+30);

但如果用户在约会时间选择框中选择 8:30,我不确定如何将时间部分设置为 8:30。

最佳答案

如果您尝试向 Date 实例添加时间,您需要执行如下操作:

const SECONDS_PER_MINUTE = 60 ;
const SECONDS_PER_HOUR   = 60 * SECONDS_PER_MINUTE ;

const dtNow = new Date();
console.log(`original: ${dtNow}`);

const dtThen = addTime(dtNow, "08:15");
console.log(`changed:  ${dtThen}`);

function addTime(dt, duration) {
  const rxDuration = /^\s*(\d\d):(\d\d)\s*$/;
  const match = rxDuration.exec(duration);

  if (!dt instanceof Date) throw new Error("Invalid dt: dt is not a Date");
  if (!match) throw new Error(`Invalid duration: ${duration}`);

  const [ , hours, minutes ] = match;
  let millisecondsSinceEpoch = dt.valueOf();

  millisecondsSinceEpoch +=  1000 * (
        hours * SECONDS_PER_HOUR
      + minutes * SECONDS_PER_MINUTE
  );

  return new Date(millisecondsSinceEpoch);
}

如果你想设置日期的时间部分,你可以这样做:

function setTime( dt , duration ) {
  const rxDuration = /^\s*(\d\d):(\d\d)\s*$/;
  const match = rxDuration.exec(duration);

  if (!dt instanceof Date) throw new Error("Invalid dt: dt is not a Date");
  if (!match) throw new Error(`Invalid duration: ${duration}`);

  const [ , hours, minutes ] = match;

  return new Date( dt.getFullYear(), dt.getMonth(), dt.getDate(), hours, minutes, 0, 0 );
}

但老实说,我可能会做这样的事情,使用 moment.jsluxon :

const moment = require("moment");
. . .
const appointmentDateTime = moment.parseTwoDigitYear( appointment.date )
                            .hours( appointment.hour)
                            .minutes( appointment.minute)
                            ;

因为生命太短,无法编写样板文件。

关于javascript - 向 Javascript 日期添加时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57281131/

相关文章:

javascript - @media 查询被 javascript DOM 操作覆盖

javascript - Node.js 中如何将 ID 从一个路由器传递到另一个路由器

javascript - 为jquery中的特定文本设置背景颜色

javascript - 如何将时间转换为特定的字符串?

javascript - 达到 maxLength 时将输入焦点移至下一个输入 - Angular 4/Typescript

javascript - Angular4 - 如何确保 ngOnDestroy 在离开之前完成

javascript - 如何在div的右侧创建一个对象(div :left)

javascript - 最小数值为 125 的正则表达式?

javascript - Angular 2 的响应式图库插件?

html - 如何在您的网站上测试您的 Aria 标签?