Как рассчитать дату окончания sh дату в любом часовом поясе с учетом необходимых рабочих часов и рабочих часов в часовом поясе PT - PullRequest
0 голосов
/ 01 августа 2020

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

Время работы в Пацифе c часовой пояс

Время работы в Pacifi c часовой пояс

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

Может ли кто-нибудь показать пример или предложить алгоритм, которому нужно следовать ?

Язык программирования не имеет значения, я могу перевести на JavaScript.

Если есть пример, использующий библиотеку «момент», он даже лучше.

Большое спасибо.

Примеры:

  1. Если сейчас понедельник, 8:00 по тихоокеанскому времени, и задание занимает 3 часа, оно завершится sh в понедельник, 11:00 по тихоокеанскому времени, потому что это так. не попасть в момент закрытия магазина.
  2. если работа длится 30 часов, то (22-8 = 14) в понедельник, 2 + 4 = 6 время закрытия, (30-14) = 16 в Завершение вторника = вторник 16:00 по тихоокеанскому времени (это для демонстрации только одного времени закрытия).
  3. Если пользователь находится в Нью-Йорке C, то его понедельник 8:00, 4:00 по тихоокеанскому времени, и будет 22 часа до выполните 30-часовую работу В понедельник 2 + 4 = 6 время закрытия, (30-22) = 8 во вторник, 8:00 по тихоокеанскому времени, вторник, 4:00 по восточному времени, поэтому для Нью-Йорка C пользователь, завершение - 4 утра вторника.
  4. Длинные задания могут проходить более одного диапазона времени закрытия, а выходные могут добавлять больше.

У нас есть пользователи во всех часовых поясах США и возможно, скоро в Великобритании и Германии, но только в одном магазине в Сиэтле

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Думаю, я понял. Кому интересно проверять мой лог c с помощью Luxon. JS?

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Job Done with LuxonJS</title>
  <meta name="viewport" content="width=device-width">
  <style>
    #output {
      font-size: 2rem;
    }
    
    #output2 {
      font-size: 2rem;
      /* color: red; */
    }
    
    #output3 {
      font-size: 2rem;
      color: green;
    }
  </style>
</head>

<body>
  <header>
    <h1>Calculating Completion Date Time</h1>
  </header>
  <main>
    <div id="output"></div>
    <div id="output2"></div>
    <div id="output3"></div>
  </main>
  <!-- <script src="luxon.min.js"></script>-->
  <script src="https://cdn.jsdelivr.net/npm/luxon@1.24.1/build/global/luxon.min.js"></script>

  <script>
    Number.prototype.between = function(a, b, inclusive) { //For elegant If statment
      var min = Math.min.apply(Math, [a, b]),
        max = Math.max.apply(Math, [a, b]);
      return inclusive ? this >= min && this <= max : this > min && this < max;
    };
    console.clear();
    //weekday: number  Get the day of the week. 1 is Monday and 7 is Sunday
    var OpenClose = [{}, // elemnt 0 not used to make Luxon Day Of the Week the index into the array 
      {
        dw: 'Monday',
        open: 4,
        close: 22,
        LuxonDayOfWeek: 1
      },
      {
        dw: 'Tuesday',
        open: 4,
        close: 22,
        LuxonDayOfWeek: 2
      },
      {
        dw: 'Wedneday',
        open: 4,
        close: 22,
        LuxonDayOfWeek: 3
      },
      {
        dw: 'Thursday',
        open: 4,
        close: 22,
        LuxonDayOfWeek: 4
      },
      {
        dw: 'Friday',
        open: 4,
        close: 19,
        LuxonDayOfWeek: 5
      },
      {
        dw: 'Saturday',
        open: 6,
        close: 18,
        LuxonDayOfWeek: 6
      },
      {
        dw: 'Sunday',
        open: 13,
        close: 22,
        LuxonDayOfWeek: 7
      }
    ]; //orderby 
    console.log(OpenClose); //Show the Shop Schedule
    let DateTime = luxon.DateTime;
    var local = DateTime.local(); //Now here
    //Make changes here !!
    let Remainghours = 12.15; //Time alotted for the job. Change to test other values. 

    var NowInPT = local.setZone("America/Los_Angeles"); //Seattle is in this TimeZone
    let JobDonePT = NowInPT; //Start at same time
    output.textContent = "Starting in PT on " + NowInPT.toLocaleString(DateTime.DATETIME_SHORT) + " Job takes " + Remainghours + " hours";
    while (Remainghours > 0) {
      if (JobDonePT.hour.between(OpenClose[JobDonePT.weekday].open, OpenClose[JobDonePT.weekday].close, true)) {
        console.log("Shop Open: " + JobDonePT.toLocaleString(DateTime.DATETIME_SHORT) + " DW=" + JobDonePT.weekday + " " + Remainghours + " Hours outstanding");
        Remainghours--; //Shop is open Use up an hour
      } else {
        console.log("Shop Closed: " + JobDonePT.toLocaleString(DateTime.DATETIME_SHORT) + " DW=" + JobDonePT.weekday + " " + Remainghours + " Hours outstanding");
        //keep going without Using Remainghours 
      }
      JobDonePT = JobDonePT.plus({
        hours: 1
      }); //addvance 1 hour on the calendar in any case
    }
    // Now we are left with a Negative fraction of an hour so we set set the actual Completion
    JobDonePT = JobDonePT.plus({
      hours: Remainghours
    }); //Remainghours is negative
    //The end DateTime may still be in Off hours Must end In work hours so
    while (!JobDonePT.hour.between(OpenClose[JobDonePT.weekday].open, OpenClose[JobDonePT.weekday].close, true)) { //Not working hours
      debugger;
      JobDonePT = JobDonePT.plus({
        hours: 1
      });
    };
    output2.textContent = "Job End in PT on " + JobDonePT.toLocaleString(DateTime.DATETIME_SHORT);
    var JobDoneMylocal = JobDonePT.toLocal();
    output3.textContent = "Job End in My Time Zone on " + JobDoneMylocal.toLocaleString(DateTime.DATETIME_SHORT);
  </script>
</body>

</html>
0 голосов
/ 01 августа 2020

Алгоритм, который вы хотите использовать, - это вычитание. Начните со списка продолжительности, доступной на каждый день. Сохраните переменную с оставшейся продолжительностью. Найдите количество часов, оставшихся до начальной даты, и вычтите это количество или оставшуюся продолжительность из оставшейся продолжительности - в зависимости от того, что меньше. Повторяйте для последующих дней, пока оставшаяся продолжительность не станет равной нулю. Если, скажем, в последний день у них осталось еще 4 часа рабочего дня, вычтите эти 4 часа из их конца дня, чтобы получить время, sh завершение работы.

Это, вероятно, поможет чтобы разбить все на целые миллисекунды. Оставьте преобразование в метку времени до конца.

...