带有数字日期偏移量的luxu难题

问题描述

环境:Win 10 Pro,Chrome 85,luxon 1.25.0

我最终要实现的目标是:在ASP.Net/c#应用程序中,持续向用户显示直到会话超时为止的时间。因为服务器和客户端可能处于不同的时区,所以我需要每个时区的UTC偏移量。客户的偏移量很容易获得。要查找服务器的偏移量(参考下面的代码片段):服务器代码页面的上次加载时间放入lblLastLoaded中。对象dto接收已解析的日期部分,包括dto.offset,我收集该日期部分应该以分钟表示。后续对luxon.DateTime.fromObject(dto)的调用失败:pst未定义。当我不设置dto.offset时(通过在下面的代码中注释掉4行),pst成功获取服务器时间,但是没有偏移量;看起来luxon使用的是我本地系统的偏移量,它为-7小时。

    <script>
        function r4onload() {
            // Get server time:
            var st = document.getElementById('lblLastLoaded').innerHTML;
            //             Date       Time     Offset
            // st has form YYYY/MM/dd HH:mm:ss -HH:mm
            //                       1         2
            //             012345678901234567890123456
            // For Example 2020/09/29 10:31:56 -07:00
            let dto = {};
            dto.year = Number(st.substring(0,4));
            dto.month = Number(st.substring(5,7));
            dto.day = Number(st.substring(8,10));
            dto.hour = Number(st.substring(11,13));
            dto.minute = Number(st.substring(14,16));
            var offsetHour = Number(st.substring(20,23)); //                        works if these 4 lines are commented out
            var offsetMinutes = Number(st.substring(24,26)); //                     works if these 4 lines are commented out
            dto.offset = offsetHour * 60 + Math.sign(offsetHour) * offsetMinutes; // works if these 4 lines are commented out
            // dto.offset is correctly calculated to -420 minutes //                 works if these 4 lines are commented out
            var pst = luxon.DateTime.fromObject(dto);
            // pst is undefined at this point -- why??
            // If I do not include anything about offset above (comment out the 4 lines 
            //    containing offsetHours,offsetMinutes,and dto.Offset,then pst comes out like this:
            //    2020-09-29T10:31:00.00000-07:00
            //    i.e.,luxon used the offset -07:00 of my local system,not the one contained in variable st.
            document.getElementById('Parsed').innerHTML = pst;
            r4startTime();
        }
        function r4startTime() {
            var dt = luxon.DateTime.local();
            var h = dt.hour;
            var m = dt.minute;
            var s = dt.second;
            m = r4checkTime(m);
            s = r4checkTime(s);
            document.getElementById('CurrTime').innerHTML =
                h + ":" + m + ":" + s;
          var t = setTimeout(r4startTime,2000);
        }
        function r4checkTime(i) {
          if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
          return i;
        }
    </script>

一个完整的Visual Studio 2017项目DemoLuxon,位于文件Site.Master中,具有上述代码片段:https://1drv.ms/u/s!AvoFL8QrGVaTsQvbaB8-Zh7GdloV?e=ODjZW5

如果上述方法很尴尬,我将感谢您提出更优雅的方法来确定客户端/服务器偏移差异。

解决方法

我设计了以下变通方法,但是原始问题尚未得到解决:

    <script>
        function r4onload() {
            var st = document.getElementById('lblLastLoaded').innerHTML;
            //             Date       Time     Offset
            // st has form YYYY/MM/dd HH:mm:ss -HH:mm
            //                       1         2
            //             012345678901234567890123456
            // For Example 2020/09/29 10:31:56 -07:00
            // Transform to ISO format:
            st = st.substring(0,4) + '-' + st.substring(5,7) + '-' + st.substring(8,10)
                + 'T' + st.substring(11,19) + ".000" + st.substring(20);
            document.getElementById('Xformed').innerHTML = st;
            var pst = luxon.DateTime.fromISO(st,{ setZone: true });
            document.getElementById('Parsed').innerHTML = pst;
            r4startTime();
        }
        function r4startTime() {
            var dt = luxon.DateTime.local();
            var h = dt.hour;
            var m = dt.minute;
            var s = dt.second;
            m = r4checkTime(m);
            s = r4checkTime(s);
            document.getElementById('CurrTime').innerHTML =
                h + ":" + m + ":" + s;
          var t = setTimeout(r4startTime,2000);
        }
        function r4checkTime(i) {
          if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
          return i;
        }
    </script>

,即首先将日期时间输入ISO格式,然后使用luxon.DateTime.fromISO。变量pst获取正确的日期时间值,包括偏移量。带有偏移的luxon.DateTime.fromObject的问题仍未解决。