首页 > 解决方案 > 日期比较格式

问题描述

我正在我的 web 应用程序中创建一个日期选择器(Materialize)系统,并且我面临一个日期比较的奇怪问题(见下文)。我想警告用户,如果他想要约会女巫少于 48 小时,他会付出更多。为此,我编写了一个脚本来检查输入 start_date 的变化。

('#event_start_at_date').on('change', function(){ 
  var limit = moment().add(2, 'days').format("DD/MM/YYYY")
  if($('#event_d_script').val() != "true"){
    if ( $(this).val() <= moment() ){
      // the date is impossible
      $(this).val(date_min)
    } else if ( $(this).val() <= limit ) { 
      // the date is less than 48h from today
      $('#date_warning').slideDown();
      if($('#event_urgent').val() == "false"){
        var amount = parseFloat($('#event_price').val()) + 10
        $('#offer_footer_price_val').text(amount);
        $('#event_price').val(amount)
        $('#event_urgent').val("true");
        $('#event_urgent_checkbox').attr('checked', true);
      }
    } else{
      // the date is more than 48h from today
      $('#date_warning').slideUp();
      if($('#event_urgent').val() == "true"){
        // The previous date was urgent
        var amount = parseFloat($('#event_price').val()) - 10
        $('#offer_footer_price_val').text(amount);
        $('#event_price').val(amount);
        $('#event_urgent').val("false");
        $('#event_urgent_checkbox').attr('checked', false);
      }
    }
    if($('#event_end_at_date').val() <= $(this).val() ){
      // The end can't be before the start
      $('#event_end_at_date').val($(this).val())
    }
  }
});

我的错误 = 仅在当天进行比较,而不是在完整日期进行。

例如,如果今天是 11 月 12 日,则将在 11 月 14 日之前应用增加。但对于其他月份(例如:12 月 12 日),也适用于 14 日之前的所有日子。

我认为这是日期格式的错误,但我无法修复它

标签: javascriptdatemomentjs

解决方案


两个问题:

  1. 您与值类型不一致,例如将字符串与 Moment 实例进行比较:

    if ( $(this).val() <= moment() ) {
    
  2. 您正在按字典顺序(即作为文本)比较应该以数字方式比较的事物,例如这里:

    } else if ( $(this).val() <= limit ) { 
    

相反,请使用您可以有意义地比较的数据类型。在这种情况下,我会使用 Moment 实例,因为比较它们会将它们强制为数字(自大纪元以来的毫秒数);

if ( moment($(this).val()) < moment() ) {

var limit = moment().add(2, 'days'); // No `format`

} else if ( moment($(this).val()) <= limit ) { 

如果您想忽略这些日期时间的时间方面并只比较日期,您可以使用startOf("day")将各种 Moment 实例设置为午夜,例如:

if ( moment($(this).val().startOf("day")) < moment().startOf("day") ) {

var limit = moment().add(2, 'days').startOf("day");

} else if ( moment($(this).val()).startOf("day") <= limit ) { 

推荐阅读