• 通过时间戳,计算距离下一个周二和周六的时间距离


    时间戳是世界时间,通过它计算小时会比东八区少8个小时,得加8才是北京时间;

    —_—、,我竟然不知道。但是getHours()方法拿到的是电脑本地的时间。

    踩了个坑,记录下避免下次忘记。

    得➕8

    得➕8

    得➕8

    重复三遍

    new Date().getTime()%(60*60*24*1000)/(60*60*1000)+8

    在线demo

    核心代码:

    1. //target星期几,周日是0,currentTime当前时间,可以是服务器返回的时间戳,或者符合日期格式的字符串
    2. function countdist(target, currentTime) {
    3. var date = new Date(currentTime);
    4. var day = date.getDay();
    5. var datetime = date.getTime();//当前的时间戳
    6. var oneDaySStime = 86400000;//一天的毫秒数
    7. var targetDate1 = target;//结束时间是周几??????
    8. console.log(date, "今天是", myDay(day));
    9. //当前时间距离【本】周2的天数,
    10. var targetDate1DateDis1 = targetDate1 - day;
    11. //这里只是算天数,没有把小时算在内,也没有考虑跨周的情况,所以不能直接显示
    12. console.log("的剩余天数", targetDate1DateDis1);
    13. //考虑跨周情况
    14. //判断当前时间是否超过目标时间,操作,就计算下一周的
    15. //如果今天是周三了,那周二活动就是下一周的了
    16. if (targetDate1DateDis1 < 0) {
    17. targetDate1DateDis1 = targetDate1DateDis1 + 7;
    18. }
    19. let todayHSM = datetime % oneDaySStime;//【世界时间】今天已消耗的是分秒时间戳
    20. console.log("今天已消耗的是分秒时间戳", todayHSM, "今天已消耗的小时", todayHSM / 1000 / 60 / 60 + 8)
    21. //剩余的天数的时间戳 - (今天已过去的时间戳))
    22. //东八区时间比世界时间多8小时,得加8才是当前的时间
    23. let disMtime = targetDate1DateDis1 * oneDaySStime - (todayHSM + (8 * 1000 * 60 * 60));
    24. console.warn("最终: 剩余天数", targetDate1DateDis1, "剩余的总秒数", disMtime, "距离目标还剩余的小时", disMtime / (1000 * 60 * 60 - 8));
    25. return {
    26. day: targetDate1DateDis1,
    27. mmtime: disMtime,//当前距离目标时间的相差时间戳
    28. targetMMtime:datetime+disMtime//目标时间的时间戳
    29. }
    30. }

    完整代码:

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>通过时间戳,判断距离下一个周二和周六的距离</title>
    8. </head>
    9. <body>
    10. <div style="display:flex;">
    11. <span>模拟今天日期 </span>
    12. <select id="select">
    13. <option value="0" checked>延后0</option>
    14. <option value="1">延后1</option>
    15. <option value="2">延后2</option>
    16. <option value="3">延后3</option>
    17. <option value="4">延后4</option>
    18. <option value="5">延后5</option>
    19. <option value="6">延后6</option>
    20. <option value="7">延后7</option>
    21. </select>
    22. <button id="btn">计算延后是星期几</button>
    23. <span id="day">--</span>
    24. </div>
    25. <div>结果</div>
    26. <div>
    27. <p>这里的天数和小时是分开的,都是总数</p>
    28. <div>距离周二活动还有:总天数(不够一天算一天):<span id="two"></span> 剩余总小时:<span id="twoH"></span></div>
    29. <div>距离周六活动还有:总天数(不够一天算一天):<span id="six"></span> 剩余总小时:<span id="sixH"></span></div>
    30. </div>
    31. <script>
    32. //demo 辅助函数
    33. function myDay(date) {
    34. switch (date) {
    35. case 0:
    36. return "星期天"
    37. break;
    38. case 1:
    39. return "星期一"
    40. break;
    41. case 2:
    42. return "星期二"
    43. break;
    44. case 3:
    45. return "星期三"
    46. break;
    47. case 4:
    48. return "星期四"
    49. break;
    50. case 5:
    51. return "星期五"
    52. break;
    53. case 6:
    54. return "星期六"
    55. break;
    56. }
    57. };
    58. //demo 辅助函数
    59. function mockTime(afterDay) {
    60. var mockTimes = new Date().getTime();
    61. var oneDaySStime = 86400000;//一天的毫秒数
    62. return mockTimes + afterDay * oneDaySStime;
    63. }
    64. //target星期几,currentTime当前时间,可以是服务器返回的时间戳,或者符合日期格式的字符串
    65. function countdist(target, currentTime) {
    66. var date = new Date(currentTime);
    67. var day = date.getDay();
    68. var datetime = date.getTime();//当前的时间戳
    69. var oneDaySStime = 86400000;//一天的毫秒数
    70. var targetDate1 = target;//结束时间是周几??????
    71. console.log(date, "今天是", myDay(day));
    72. //当前时间距离【本】周2的天数,
    73. var targetDate1DateDis1 = targetDate1 - day;
    74. //这里只是算天数,没有把小时算在内,也没有考虑跨周的情况,所以不能直接显示
    75. console.log("的剩余天数", targetDate1DateDis1);
    76. //考虑跨周情况
    77. //判断当前时间是否超过目标时间,操作,就计算下一周的
    78. //如果今天是周三了,那周二活动就是下一周的了
    79. if (targetDate1DateDis1 < 0) {
    80. targetDate1DateDis1 = targetDate1DateDis1 + 7;
    81. }
    82. let todayHSM = datetime % oneDaySStime;//【世界时间】今天已消耗的是分秒时间戳
    83. console.log("今天已消耗的是分秒时间戳", todayHSM, "今天已消耗的小时", todayHSM / 1000 / 60 / 60 + 8)
    84. //剩余的天数的时间戳 - (今天已过去的时间戳))
    85. //东八区时间比世界时间多8小时,得加8才是当前的时间
    86. let disMtime = targetDate1DateDis1 * oneDaySStime - (todayHSM + (8 * 1000 * 60 * 60));
    87. console.warn("最终: 剩余天数", targetDate1DateDis1, "剩余的总秒数", disMtime, "距离目标还剩余的小时", disMtime / (1000 * 60 * 60 - 8));
    88. return {
    89. day: targetDate1DateDis1,
    90. mmtime: disMtime
    91. }
    92. }
    93. var btn = document.getElementById("btn");
    94. var todayDay = document.getElementById("day");
    95. var two = document.getElementById("two");
    96. var six = document.getElementById("six");
    97. var twoH = document.getElementById("twoH");
    98. var sixH = document.getElementById("sixH");
    99. var myselect = document.getElementById("select");
    100. var index = myselect.selectedIndex;
    101. var value = myselect.options[index].value;
    102. function getCount(laterDay) {
    103. var dis1 = countdist(2, mockTime(laterDay));
    104. var dis2 = countdist(6, mockTime(laterDay));
    105. console.log("最终: 周二剩余天数", dis1, "周六的剩余天数", dis2);
    106. two.innerHTML = dis1.day;
    107. six.innerHTML = dis2.day;
    108. //8区,所以要加8,时间戳是世界时间
    109. twoH.innerHTML = dis1.mmtime / 60 / 60 / 1000;
    110. sixH.innerHTML = dis2.mmtime / 60 / 60 / 1000;
    111. }
    112. function showData() {
    113. var index = myselect.selectedIndex;
    114. var value = myselect.options[index].value;
    115. console.log("模拟延后的时间", value)
    116. getCount(value);
    117. var date = new Date(mockTime(value));
    118. var day = date.getDay();
    119. todayDay.innerHTML = myDay(day);
    120. }
    121. btn.onclick = function () {
    122. showData();
    123. }
    124. showData();
    125. </script>
    126. </body>
    127. </html>

    疑问:

    如果我的软件的用户是全球的呢,总不能写死➕8吧???

    这时候getTimezoneOffset函数就出场了

    getTimezoneOffset() 方法可返回格林威治时间和本地时间之间的时差,以分钟为单位。

    例如,如果时区为东2区, 将返回-120 。

    全球一共划分为24个时区。 它们是中时区(零时区)、东1-12区,西1-12区

    一下代码,如果在东8区得到的是-8,如果是西8区得到的将会是8,,可以根据正数或者负数得到当前用户是在东区还是西区

    1. var d = new Date();
    2. var x = document.getElementById("demo");
    3. x.innerHTML=d.getTimezoneOffset()/60;

    修复问题

    上面的例子存在问题

    • 只能东八区使用,其他区会出问题
    • 如果出现世界世界和当前时间不是同一天的时候也会有问题(例如本地时间2点,那拿到今天已过去的小时会是26)

    核心代码改成如下,

    1. //target星期几,周日是0,currentTime当前时间,可以是服务器返回的时间戳,或者符合日期格式的字符串
    2. function countdist(target, currentTime) {
    3. var date = new Date(currentTime);
    4. var day = date.getDay();
    5. //修复时区问题,得到当前时区时间的时间戳
    6. var datetime = date.getTime() - date.getTimezoneOffset()*60*1000;//【无论东区还是西区】当前的时间戳,当地的时间戳
    7. console.log("时间差",date.getTimezoneOffset()/60)
    8. var oneDaySStime = 86400000;//一天的毫秒数
    9. var targetDate1 = target;//结束时间是周几??????
    10. var nowIsTargetDay=false;//当前是否是已经到达目标日期
    11. console.log(date, "今天是", myDay(day));
    12. //当前时间距离【本】周2的天数,
    13. var targetDate1DateDis1 = targetDate1 - day;
    14. //这里只是算天数,没有把小时算在内,也没有考虑跨周的情况,所以不能直接显示
    15. console.log("的剩余天数", targetDate1DateDis1);
    16. //考虑跨周情况
    17. //判断当前时间是否超过(或等于)目标时间,操作,就计算下一周的
    18. //如果今天是周三了,那周二活动就是下一周的了
    19. if (targetDate1DateDis1 <= 0) {
    20. targetDate1DateDis1 = targetDate1DateDis1 + 7;
    21. }
    22. //当前时间已经在目标日期内
    23. if(targetDate1DateDis1==0){
    24. nowIsTargetDay=true;
    25. }
    26. let todayHSM = datetime % oneDaySStime;//【本地时间】今天已消耗的是分秒时间戳
    27. console.log("今天已消耗的是分秒时间戳", todayHSM, "今天已消耗的小时", todayHSM /(1000 * 60 * 60))
    28. //剩余的天数*一天的时间戳-今天已消耗的时间
    29. let disMtime = targetDate1DateDis1 * oneDaySStime-todayHSM;
    30. console.warn("最终: 剩余天数", targetDate1DateDis1, "剩余的总秒数", disMtime, "距离目标还剩余的小时", disMtime / (1000 * 60 * 60));
    31. return {
    32. nowIsTargetDay:nowIsTargetDay,//是否已经到了目标日期
    33. nextDayDiss: targetDate1DateDis1,//距离下一个活动开启的天数,不会为0,如果已经在目标日期了,会变成下一周的目标
    34. mmtime: disMtime,//距离下一次活动日期时间戳的差值
    35. //下次活动日期的时间戳,这里一定要用世界时间戳,不能用修复好的本地时间戳
    36. //因为外面使用的时候一般是直接new Date()来拿当前时间的时间戳的,这样拿到的是世界世界的时间戳
    37. //如果和我们修复的时区时间戳对比,就会出现差,例如东八区的话,new Date()-datetime+disMtime 会多出8小时
    38. netDaytmpTime: date.getTime()+disMtime
    39. }
    40. }

  • 相关阅读:
    第二十三章 CSP Session 管理 - 身份验证共享策略
    go自定义端口监听停用-------解决端口被占用的问题
    Copilot如何将word文稿一键转为PPT
    [附源码]计算机毕业设计JAVAjsp大学生就业信息检索系统
    《QDebug 2022年6月》
    【C语言易错点】循环结构
    Spark on k8s 在阿里云 EMR 的优化实践
    服务器正文23:定时器设计与实现(8/7)
    线性表顺序表综合应用题P18
    【Java+LeetCode训练】binarySearch源码解析
  • 原文地址:https://blog.csdn.net/u014071104/article/details/127973302