【问题标题】:How do you display "mm/dd/yyyy" instead of "12/31/1969" in date input fields when date is null?当日期为空时,如何在日期输入字段中显示“mm/dd/yyyy”而不是“12/31/1969”?
【发布时间】:2015-11-24 19:41:22
【问题描述】:

基本上我的数据库中有一个日期类型的列,但可以为空。我有一个使用 Angular/Bootstrap 的表单,允许用户根据需要输入日期,但他们不必这样做,为此我使用 Bootstraps 表单控制类并为输入提供日期类型。

当表单第一次加载日期为空值时,一切正常。数据库保存得很好,一切都很好。但是,当我将记录加载到此表单中时,如果数据库显示空值,Angular/Javascript 会将其显示为 1969 年 12 月 31 日,而不是像最初加载空值时那样显示“mm/dd/yyyy”。这会导致问题,因为如果用户保存此表单,它会将默认的 1969 年 12 月 31 日作为实际日期并将其保存为输入。

我已经通过控制台对其进行了跟踪,并且当它到达我的模型绑定时,我 100% 肯定日期值为 null (),所以我想不出在这种情况下该怎么做,我真的很感激任何指针。

关于拉取数据:

if (myDateFromDatabase !== null) { 
    myDateFromDatabase = new Date(myDateFromDatabase); 
}

在视图中:

<input ng-model="myDateFromDatabase" type="date" class="form-control" />

【问题讨论】:

  • 请显示一些代码。您的问题是题外话,否则将被搁置。
  • 更具体地说,我要的是执行您在问题中描述的控制器或指令。
  • 这听起来真的像你得到一个空字符串(甚至是一个 0)与一个 null 返回 myDateFromDatabase...如果你这样做 if (myDateFromDatabase !== null &amp;&amp; myDateFromDatabase !== '') 你仍然得到那些结果?如果你在 if 块内放了一个 debugger,你的控制台会落在上面吗?我知道你说你是 100% 肯定的 myDateFromDatabasenull,但你来这里是为了第二眼,所以看到那个证明也不会有什么坏处。
  • 如果您需要,请在您引用的地方发布它我还可以证明它一直沿用到控制器中的绑定。

标签: javascript angularjs date angular-ui-bootstrap


【解决方案1】:

Angular 需要将任何 input[date] 设为 有效 javascript Date 对象,否则它将默认为空字符串,然后默认为 1969 年 12 月 31 日。 Javascript Date 对象必须始终具有有效的Date

如果你希望能够使用一个可以为空的Date对象,你应该将默认属性设置为undefined,然后当你绑定你的模型时,你可以先看看它是不是null,如果是的。

var myDateFromDatabase = undefined; // if you get null back from database, you'll keep this undefined

然后当您获取数据并应用它时...

if (data.dateRetrieved !== null) { 
    // only make myDateFromDatabase an actual date if there is something stored
    myDateFromDatabase = new Date(data.dateRetrieved); 
}

对于您的默认文本,添加placeholder 属性:

<input ng-model="myDateFromDatabase" type="date" placeholder="mm/dd/yyyy" class="form-control" />

【讨论】:

  • 我会尝试未定义的方法并报告!谢谢。
  • 谢谢!基本上在空检查中,我添加了 else {myDateFromDatabase = undefined;} 并且工作得很好。你是个狂怒的冠军。对于未来的人来说,查看这个占位符是没有必要的。
  • 没问题。很高兴你得到它。
【解决方案2】:

就像 isherwood 所说,如果没有一些代码上下文,这个问题就更难回答了。如果添加了一些问题,我会更新我的问题。

您必须在代码中的某处格式化日期。如果 javascript 是从日期对象格式化它,那么您只需要执行以下操作:

if(some_date === null)
    some_date = 'mm/dd/yy;
else {
    //date formatting code
}

如果您的 php 或查询为您格式化日期,那么如果您在前端执行此操作:

<input ng-attr-value="{{obj.date}}"/>

然后将其更改为:

<input ng-attr-value="{{obj.date === null ? 'mm/dd/yyyy' : obj.date}}"/>

或者,当您从 api 收到数据时,也可以做类似的事情。

编辑/注意:如果是日期输入字段,您可能会在 Angular 1.3+ 中使用此方法时遇到问题。

【讨论】:

  • 这不能回答问题,并且将日期设置为字符串 'mm/dd/yyyy' 会在 Angular 1.3+ 中引发日期格式错误,因为它需要日期对象类型。
  • @IfTrue 从技术上讲,他要求值为“mm/dd/yyyy”,而不是占位符。我在他的问题中也没有太多的例子(他后来添加了很多),我尽我所能回答了这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2020-01-17
  • 2018-02-01
  • 1970-01-01
相关资源
最近更新 更多