0

使用 JavaScript 和矩库,给定用户的现在、完成工作所需的小时数和分钟数,以及下表西雅图商店的营业和关闭时间。

太平洋时区的工作时间

太平洋时区的工作时间

我需要预测西雅图商店在用户所在时区完成工作的日期和时间。

任何人都可以展示一个示例或建议遵循的算法吗?

编程语言无所谓,我可以翻译成 JavaScript。

如果有一个使用'moment'库的例子,那就更好了。

非常感谢。

例子:

  1. 如果现在是太平洋时间星期一上午 8 点,并且工作需要 3 个小时,它将在太平洋时间星期一上午 11 点完成,因为它没有达到商店关闭的时间。
  2. 如果工作需要 30 小时,那么 (22-8= 14 ) 星期一,2+4 = 6 关闭时间,(30-14) = 16 星期二完成 = 星期二下午 4 点在 PT (这只是为了演示一个关闭时间)。
  3. 如果用户在纽约市,那么他的星期一早上 8 点是太平洋时间凌晨 4 点,将有 22 小时来完成 30 小时的工作 星期一,2+4 = 6 关闭时间,(30-22) = 8 星期二上午 8 点 PT 是美国东部时间周二凌晨 4 点,因此对于纽约市用户来说,完成时间是周二凌晨 4 点。
  4. 长时间的工作可以跨越一个以上的关闭时间范围,而周末可以增加更多。

我们在美国所有时区都有用户,也许很快在英国和德国都有用户,但在西雅图只有一家商店

4

2 回答 2

0

您要使用的算法是减法。从每天可用的持续时间列表开始。保留一个剩余持续时间的变量。找出开始日期剩余的小时数,然后从剩余的持续时间中减去它,或剩余的持续时间本身 - 以较少者为准。重复后续几天,直到剩余的持续时间为零。如果说在最后一天他们的工作日还剩下 4 小时,那么从他们一天的结束中减去这 4 小时,以获得他们完成工作的时间。

它可能有助于将所有内容分解为整数毫秒。将转换保留到时间戳直到结束。

于 2020-08-01T11:14:43.507 回答
0

我想我明白了。谁在乎使用 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
      }); //advance 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>

于 2020-08-02T13:24:15.600 回答