Javascript 具有 NULL 时间的 Date() 对象
Javascript Date() object with NULL Time
有没有办法只指示 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
组件中的年、月和日是任意的,不会被使用,但如果您想创建一个 [=11=,它们仍然需要存在] 对象。
您不能从日期中删除时间信息。
如果您想独立获得这两种信息,请使用 Date 作为日期并忽略时间(例如,确保它始终恰好是午夜),并使用另一个字段来保存时间(它可以是您忽略日期但不是时间,或者它可以是一个带有格式化时间的输入文本,或者多个带有小时、分钟等的输入文本)。
UI 表示由您决定。
JavaScript 日期对象是使用自 1970 年 1 月 1 日 UTC 以来的毫秒数在内部定义的。因此你被时间部分困住了。
试试这个代码
var date = new Date(2015, 0, 13);
console.log(date.valueOf());
你会得到这个输出
1421125200000
这里是标准定义...
ECMAScript Language Spec 见第 165 页
来自 ECMA 标准:
Date 对象包含一个数字,表示精确到毫秒的特定时刻。这样的数字
称为时间值。时间值也可能是 NaN,表示 Date 对象不代表一个
具体时间。
自 1970 年 1 月 1 日 UTC 以来,时间在 ECMAScript 中以毫秒为单位测量。在时间值闰秒
被忽略。假定每天恰好有 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
相对于 1970 年 1 月 1 日 UTC 午夜测量的天数到 100,000,000 天。这给
8,640,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
来检查 Date
time_is_meaningful
属性 并采取相应行动。
有没有办法只指示 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
组件中的年、月和日是任意的,不会被使用,但如果您想创建一个 [=11=,它们仍然需要存在] 对象。
您不能从日期中删除时间信息。 如果您想独立获得这两种信息,请使用 Date 作为日期并忽略时间(例如,确保它始终恰好是午夜),并使用另一个字段来保存时间(它可以是您忽略日期但不是时间,或者它可以是一个带有格式化时间的输入文本,或者多个带有小时、分钟等的输入文本)。 UI 表示由您决定。
JavaScript 日期对象是使用自 1970 年 1 月 1 日 UTC 以来的毫秒数在内部定义的。因此你被时间部分困住了。
试试这个代码
var date = new Date(2015, 0, 13);
console.log(date.valueOf());
你会得到这个输出
1421125200000
这里是标准定义...
ECMAScript Language Spec 见第 165 页
来自 ECMA 标准:
Date 对象包含一个数字,表示精确到毫秒的特定时刻。这样的数字 称为时间值。时间值也可能是 NaN,表示 Date 对象不代表一个 具体时间。
自 1970 年 1 月 1 日 UTC 以来,时间在 ECMAScript 中以毫秒为单位测量。在时间值闰秒 被忽略。假定每天恰好有 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 相对于 1970 年 1 月 1 日 UTC 午夜测量的天数到 100,000,000 天。这给 8,640,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
来检查 Date
time_is_meaningful
属性 并采取相应行动。