Формат сравнения даты - PullRequest
0 голосов
/ 12 ноября 2018

Я создаю систему выбора даты (Materialise) в своем веб-приложении и сталкиваюсь со странной проблемой сравнения дат (см. Ниже). Я хотел бы предупредить пользователя, что, если он хочет, чтобы свидание ведьмы было менее 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())
    }
  }
});

Моя ошибка = Сравнение производится только в день, а не в полную дату.

Например, если сегодня 12 ноября, увеличение применяется до 14 ноября. Но также и во все дни до 14 для остальных месяцев (например, 12 декабря).

Мне кажется, что это ошибка формата даты, но я не могу ее исправить

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Две проблемы:

  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 ) { 
0 голосов
/ 12 ноября 2018

Если не смотреть внимательно на код, похоже, что ваша ошибка, скорее всего, связана с тем, что ваш формат DD // MM // YYYY.

Ваши вычисления даты, будь они больше или меньше, вычисляютсяматематически, как будто они были просто числами.то есть 02/05/1995 просто рассчитывается как 02051995.

Таким образом, ваше неожиданное поведение заключается в том, что, если вы представите, вы предполагаете, что ДЕНЬ - это самая большая единица, то есть изменение за день, численно технически больше,чем изменение ГОДА, потому что ваши годы - самая маленькая единица, а ваши дни - самые большие.

т.е.03/10/2018 будет больше, чем 02/12/2018, потому что 03102018 больше, чем 02122018.

Измените форматирование при выполнении расчетов на YYYY-MM-DD, чтобы решить вашу проблему.

...