JavaScript, сохраняющий отдельные значения в формате даты

#javascript #date #conditional

#javascript #Дата #условные операторы

Вопрос:

Я работаю над веб-приложением «аренда автомобиля» … таким образом, пользователь может выбирать даты «от» и «до», пока он не захочет арендовать автомобиль .. эти значения сохраняются в отдельных переменных (см. Ниже):

 //BACK
var backDay = parseInt(jQuery('#back_day').val(),10);
var backMonth = parseInt(jQuery('#back_month').val(),10);
var backYear = parseInt(jQuery('#back_year').val(),10);
var backHours = parseInt(jQuery('#back_hour').val(),10);
var backMinutes = parseInt(jQuery('#back_minute').val(),10);
//FROM
var fromDay = parseInt(jQuery('#from_day').val(),10);
var fromMonth = parseInt(jQuery('#from_month').val(),10);
var fromYear = parseInt(jQuery('#from_year').val(),10);
var fromHours = parseInt(jQuery('#from_hour').val(),10);
var fromMinutes = parseInt(jQuery('#from_minute').val(),10);
var freeKm = parseInt(jQuery('#freeKm').val(),10);
var group = jQuery(groupKON).val();
  

Итак, поскольку владелец заметил, что в некоторые периоды года спрос выше, в этот период (сезон) он хотел бы увеличить цену на аренду автомобиля.

Итак, между указанными ниже датами цена должна расти.

saison1 1.3.17-21.5.17 повышение цены на 15% saison2 19.06.17-02.07.17 повышение цены на 10% saison3 12.09.17-31.10.17 повышение цены на 10%

Мой вопрос в том, как сохранить дату в переменной, чтобы я мог написать условный оператор?

Например:

     if(date == saison1) {
function increaseThePrice() {
newPrice = price*1.5;
return newPrice;
}
  

Надеюсь, мой вопрос достаточно ясен!

Заранее спасибо!

Денис

Комментарии:

1. Вы не используете сервер? Зачем хранить дату в переменной, когда вы можете легко хранить даты в базе данных на сервере, получать сезонные даты с сервера, когда вам это нужно, и сравнивать их с текущей датой.

Ответ №1:

я верю, что @Softberry прав, вы не должны размещать это на стороне клиента.

я включил изменение, предложенное @RobG. (

«… все даты, созданные в этом решении, равны GMT 0 …», только если это часовой пояс хоста, на котором запущен скрипт, или если вы должны были использовать новую дату (Date.UTC(2017,9-1,17)). Нет необходимости указывать нулевые значения, отсутствующие параметры по умолчанию обрабатываются как нулевые (за исключением даты, по умолчанию она равна 1).

теперь, если вы используете его на клиенте или сервере, проблема остается той же.

вот решение javascript

 /** main logic */
function getCostForInterval(basePrice,from,back){
  var total=0;
  var seasonAdjustments=getSeasonPriceMultipliers();
  /* iterate through each day of the interval (from-back)*/
  for(
    var d=from;/* start */
    d.getTime()<=back.getTime();/* end condition */
    d.setDate(d.getDate() 1)/* increment by one day */
  ){
    total =basePrice*getAdjustmentForDate(d,seasonAdjustments);
  }
   return total;
 }


/** getAdjustmentForDate returns either 1 or
   * or the corresponding price multiplier
   * when the date falls into a season
   */
function getAdjustmentForDate(date,seasons){
  var multiplier=1;
  for(var ix=0;ix<seasons.length;ix  ){
    var season=seasons[i];
  /** if date falls inside current season
    **/
    if(season.begin.getTime()<date.getTime()
      amp;amp; date.getTime()<season.begin.getTime() ){
      return season.multiplier;
    }
  }
  /** if date doesn't fall inside any
    * of the season intervals */
  return multiplier;
}

/*** getSeasonPriceMultipliers 
  ** returns an array of intervals where 
  ** price modifications may apply
  ** 
  ** you can change the data retrieving mechanism
  ** from hard coded to an http/ajax call
***/
function getSeasonPriceMultipliers(){
   var saisons=[
  {
    begin : new Date(Date.UTC(2017,3-1,1,0,0,0)),
    end : new Date(Date.UTC(2017,5-1,21,23,59,59)),
    multiplier : 1.15
  },
  {
    begin : new Date(Date.UTC(2017,6-1,19,0,0,0)),
    end : new Date(Date.UTC(017,7-1,2,23,59,59)),
    multiplier : 1.10
  },
  {
    begin : new Date(Date.UTC(2017,9-1,17,0,0,0)),
    end : new Date(Date.UTC(2017,10-1,31,23,59,59)),
    multiplier : 1.10
  }
 ];
  return saisons;
}
  

и тест

  function test(BASE_PRICE,backDay,backMonth,backYear, backHours,backMinutes,
fromDay,fromMonth,fromYear,fromHours,fromMinutes
){
var from=new Date(fromYear,fromMonth,fromDay,fromHours,fromMinutes,0)
var back=new Date(backYear,backMonth,backDay,backHours,backMinutes,0)
return getCostForInterval(BASE_PRICE,from,back)
}
  

решение не учитывает часовые пояса, все даты, построенные в этом решении, равны GMT 0.
помните о различиях в часовых поясах между точкой извлечения и точкой возврата. если цена указана за день, сдвиг на летнее время не будет представлять проблемы, если цена указана за час, вам нужно соответствующим образом ее скорректировать.

если вы используете javascript на стороне клиента, я рекомендую обернуть все это в IIFE и предоставить доступ только к функции getCostForInterval, используйте http-вызов для извлечения данных сезона в функции getSeasonPriceMultipliers и, в конечном итоге, уродовать все это (исходный код и json)

Комментарии:

1. » … все даты, построенные в этом решении, равны GMT 0 … «, только если это часовой пояс хоста, на котором запущен скрипт, или если вы должны были использовать new Date(Date.UTC(2017,9-1,17)) . Нет необходимости указывать нулевые значения, отсутствующие параметры по умолчанию обрабатываются как нулевые (за исключением даты, по умолчанию она равна 1).

2. Большое вам спасибо за усилия!

Ответ №2:

Установка информации о ценах с помощью клиентского скрипта может быть опасной

Если вы устанавливаете скидки через JavaScript, пользователи могут просто изменить его и сделать заказ вместо 15%, скажем, 95%. Так что будьте осторожны. Устанавливайте цены и скидки с помощью серверного скрипта, а не с помощью JavaScript

Комментарии:

1. Большое вам спасибо за усилия!

Ответ №3:

Дата — это не что иное, как форматированная строка, поэтому ее можно преобразовать в объект Date, сформировать пользовательские даты и т. Д. Это означает, что вы можете сохранить его как обычную строку, но вам нужно использовать известный формат даты.

 var date = "2016/02/12"; // for example
  

Но хорошо, сохранение даты скидки в браузере клиента с помощью javascript дает ему полный контроль над вашими данными javascript, поэтому ими можно легко манипулировать и злоупотреблять. Вы обязательно должны использовать для этого какой-нибудь серверный интерфейс.

Комментарии:

1. Большое вам спасибо за усилия!