具有NULL时间的Javascript Date()对象

时间:2015-03-02 21:46:40

标签: javascript date time types

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

e.g。

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

我希望能够分辨出仅仅输入日期部分的用户与明确同时输入日期和时间的用户之间的差异

4 个答案:

答案 0 :(得分:4)

不是真的。 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对象,它们仍然需要存在

答案 1 :(得分:2)

JavaScript日期对象在内部定义自UTC 1970年1月1日以来的毫秒数。因此,你会被时间部分困住。

试试此代码

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

您将获得此输出

1421125200000

这是标准定义......

ECMAScript Language Spec请参阅第165页

来自ECMA标准:

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

自UTC时间1970年1月1日起,时间以ECMAScript为单位,以毫秒为单位。在时间值闰秒 被忽略了。假设每天恰好有86,400,000毫秒。 ECMAScript数值 可以表示从-9,007,199,254,740,992到9,007,199,254,740,992的所有整数;这个范围就足够了 测量大约285,616年内任何瞬间的精确到毫秒精度 从UTC时间1970年1月1日起向前或向后。

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

表示

答案 2 :(得分:2)

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

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;

这比你的毫秒黑客更简单,更清洁 比两个单独的变量方便。那么你可以,如果你 wish,subclass具有自定义toString的日期,用于检查 time_is_meaningful财产并采取相应行动。

答案 3 :(得分:1)

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