首先让我注意,默认情况下,javascript 会为您提供 UTC 时间。
JavaScript 日期基本上指定为自 UTC 1970 年 1 月 1 日午夜以来经过的毫秒数。此日期和时间与 UNIX 纪元相同,它是计算机记录的日期和时间值的主要基准值。(参考)
当你使用该Date()
函数创建一个日期对象时,上述情况是正确的
使用 ES20xx,您可以使用模板文字(IE 不支持)和padStart(IE 不支持)字符串扩展来根据您的喜好格式化 Date 对象,如下面的片段所示。
我也有date.toLocaleString()
它以浏览器运行该功能的区域中常用的格式给出字符串
toLocaleString() 方法返回一个带有该日期的语言敏感表示的字符串。新的语言环境和选项参数让应用程序指定应该使用其格式约定的语言并自定义函数的行为。在忽略语言环境和选项参数的旧实现中,使用的语言环境和返回的字符串的形式完全依赖于实现。(参考)
所以最简单的方法是在从 Date 对象获得的 Unix 时间戳上加上 15 分钟,并用它格式化toLocaleString
(这是第一个片段)
您还可以像比较任何整数一样比较下面的两个日期对象
var dt1 = (new Date()).getTime();//Unix timestamp (in milliseconds)
console.log("Current date Unix timestamp(ms)")
console.log(dt1)
console.log("15 mins later date Unix timestamp(ms)")
console.log(dt1+900000)//15min=900000ms (15*60*1000)
var dt = new Date(dt1);
var dt2= new Date(dt1+900000)
console.log("Unformatted dates 15 min apart (ISO 8601 / UTC)")
console.log(dt)
console.log(dt2)
console.log("Formatted dates 15 min apart (According to your timezone)")
console.log(dt.toLocaleString())
console.log(dt2.toLocaleString())
下面是较长的片段,涉及在显示日期对象时对其进行格式化。我觉得这不如上述方法最佳。但仍然可以完成工作。
var dt = new Date();
console.log(dt);
const localdte = dt.toLocaleString();
console.log(localdte);
const [dated, time, ampm] = localdte.split(' ');
const [hh, mm, ss] = time.split(':');
var date = `${
dt.getDate().toString().padStart(2, '0')}/${
(dt.getMonth()+1).toString().padStart(2, '0')}/${
dt.getFullYear().toString().padStart(4, '0')} ${
dt.getHours().toString().padStart(2, '0')}:${
dt.getMinutes().toString().padStart(2, '0')}`
console.log("Date right now");
console.log(date);
console.log("date 15 mins later");
var date15 = `${
dt.getDate().toString().padStart(2, '0')}/${
(dt.getMonth()+1).toString().padStart(2, '0')}/${
dt.getFullYear().toString().padStart(4, '0')} ${
(dt.getMinutes()>44?(dt.hours==23?00:dt.getHours()+1):dt.getHours()).toString().padStart(2, '0')}:${
((dt.getMinutes()+15)%60).toString().padStart(2, '0')}`
console.log("24 hour format " + date15);
if (ampm == "PM" && hh != 12 && hh!=00) {
var date15 = `${
dt.getDate().toString().padStart(2, '0')}/${
(dt.getMonth()+1).toString().padStart(2, '0')}/${
dt.getFullYear().toString().padStart(4, '0')} ${
(dt.getMinutes()>44?(dt.getHours()+1)%12:dt.getHours()%12).toString().padStart(2, '0')}:${
((dt.getMinutes()+15)%60).toString().padStart(2, '0')}`
console.log("12 hour format " + date15 + ampm); //12 hour format
} else if (hh == 00) {
var date15 = `${
dt.getDate().toString().padStart(2, '0')}/${
(dt.getMonth()+1).toString().padStart(2, '0')}/${
dt.getFullYear().toString().padStart(4, '0')} ${
(dt.getMinutes()>44?1:12).toString().padStart(2, '0')}:${
((dt.getMinutes()+15)%60).toString().padStart(2, '0')}`
console.log("12 hour format " + date15 + ampm);
} else {
console.log("12 hour format " + date15 + ampm); //12 hour format
}
const dateISO = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), dt.getHours(), ((dt.getMinutes() + 15) % 60), dt.getMilliseconds());
console.log("ISO 8601 format (UTC)");
console.log(dateISO);
注意:chrome 控制台和代码段控制台输出存在差异。在 chrome 控制台中,日期对象的输出始终被格式化为当地时间。在代码片段控制台中,日期对象的输出采用 UTC 格式并符合ISO8601 。
感谢@RobG 指出我之前回答中的错误。