【问题标题】:Javascript Date() object with NULL Time带有 NULL 时间的 Javascript Date() 对象
【发布时间】:2015-05-03 09:50:27
【问题描述】:

有没有办法只指示 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

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

【问题讨论】:

  • 类似问题但不重复:stackoverflow.com/questions/13689023/…
  • "错了——我没有设置时间!" --- 不要将数据与其表示混淆。
  • 你永远不会得到null,因为那是无效的,它正在做它应该做的事情
  • (new Date()).toDateString() ?
  • 您可以通过 Date API 提取所需的任何字段来自己格式化日期字符串,或者您可以使用 Moment.js 或 DateJS 之类的库来执行此操作。 Date 对象总是具有日期和时间信息。

标签: javascript date time types


【解决方案1】:

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

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 属性并采取相应措施。

【讨论】:

    【解决方案2】:

    JavaScript Date 对象是使用自 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 天。这给 到 1970 年 1 月 1 日 UTC 的任一侧 8,640,000,000,000,000 毫秒的范围。 UTC 1970 年 1 月 1 日开始的午夜的确切时刻由值 +0 表示

    【讨论】:

    • +1 感谢您提取规范。我没有意识到的毫秒 - 这实际上给了我一个想法,将添加我自己的答案
    【解决方案3】:

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

    【讨论】:

    • 这和 Andrew 一分钟前的建议差不多。
    【解决方案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 感谢您精心编辑的答案。想到另一个hackaround。正如 Ken 的回答中所指出的,Date() 对象的粒度为毫秒,我的 datepicker + timepicker 无论如何都不会使用它。所以我可以利用它来发挥我的优势:我可以将“原始”默认时间设置为午夜后 1 毫秒,我将其视为“NULL”,而午夜到毫秒将被视为显式午夜。
    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多