Javascript Date() object with NULL Time

Javascript Date() object with NULL Time

本文关键字:with NULL Time object Date Javascript      更新时间:2023-09-26

有没有办法只指示 Date(( 对象的日期部分,而不指示时间?

例如

var d = Date();
d.setFullYear(2015, 0, 13);
d.toString();
"Tue Jan 13 2015 00:00:00 GMT-0500 (EST)"  // Wrong - I didn't set a time!
"Tue Jan 13 2015     NULL GMT-0500 (EST)"  // Expected Result

我希望能够区分仅输入日期部分的用户与明确输入日期和时间的用户之间的区别

不是真的。Javascript Date对象总是有时间的。你可以在午夜离开它,如果你愿意,可以忽略它,但它仍然会在那里。这取决于你如何解释它。

如果你想能够表示一个空时间,你可以将午夜解释为这个意思,尽管这样你就没有办法表示实际午夜的时间。如果您希望能够有一个空时间并且仍然表示每个可能的时间,则需要有两个变量。

您可以拥有:

// Date with null time
var date = new Date(2015, 0, 13); // time component ignored
var time = null;
// Date with non-null time
var date = new Date(2015, 0, 13); // time component ignored
var time = new Date(1970, 0, 1, 9, 30); // date component ignored

请注意,在第二个示例中,time组件中的年、月和日是任意的,不会使用,但如果要创建Date对象,它们仍然需要存在。

JavaScript

Date 对象在内部使用自 1970 年 1 月 1 日 UTC 以来的毫秒数进行定义。 因此,您被时间部分所困。

试试这个代码

var date = new Date(2015, 0, 13);
console.log(date.valueOf());

您将获得此输出

1421125200000

这是标准定义...

ECMAScript 语言规范 参见第 165 页

从ECMA标准:

Date 对象包含一个数字,指示在一毫秒内的特定时刻。这样的数字称为时间值。时间值也可以是 NaN,指示 Date 对象不表示特定的时刻。

时间以 ECMAScript 为单位,以毫秒为单位,自 1970 年 1 月 1 日 UTC 以来。在时间值中 闰秒被忽略。假设每天正好有 86,400,000 毫秒。ECMAScript 数值可以表示从 –9,007,199,254,740,992 到 9,007,199,254,740,992 的所有整数;这个范围足以测量大约 285,616 年内任何瞬间的时间到毫秒精度,要么前进或后退,从 1970 年 1 月 1 日 UTC 开始。

ECMAScript Date 对象支持的实际时间范围略小:正好是 –100,000,000天到 100,000,000 天相对于 1970 年 1 月 1 日凌晨 UTC 的午夜测量。这给了范围为 8,640,000,000,000,000,000 毫秒,位于 1970 年 1 月 1 日 UTC 的两侧。UTC 时间 1970 年 1 月 1 日开始的午夜确切时刻由值 +0 表示

日期是对象。因此,您可以根据需要向它们添加属性:

var date_only = new Date("2015-03-04");
date_only.time_is_meaningful = false;
var date_with_time = new Date("2015-03-04T10:47");
date_with_time.time_is_meaningful = true;

这比毫秒级的黑客更简单、更干净,甚至更多比有两个单独的变量方便。然后你可以,如果你愿望,子类日期,带有toString检查 time_is_meaningful财产并采取相应行动。

不能从日期中删除时间信息。如果您想独立拥有这两个信息,请使用日期作为日期并忽略时间(例如,确保它始终是午夜(,并使用另一个字段来保存时间(它可以是您忽略日期而不是时间的日期,或者它可以是一个带有格式化时间的输入文本, 或带有小时、分钟等的多个输入文本(。UI 表示形式由您决定。