Javascript luxon中数字日期偏移的困难

Javascript luxon中数字日期偏移的困难,javascript,timezone-offset,luxon,Javascript,Timezone Offset,Luxon,环境:Win 10 Pro、Chrome 85、luxon 1.25.0 我试图最终实现的是:在ASP.Net/c应用程序中,不断向用户显示会话超时之前的时间量。因为服务器和客户端可能位于不同的时区,所以我需要每个时区的UTC偏移量。客户机的偏移量很容易获得。要查找服务器的偏移量(请参考下面的代码段):服务器代码将上次加载的页面放入lblLastLoaded。对象dto接收解析的日期部分,包括dto.offset,我收集到它应该以分钟表示。对luxon.DateTime.fromObject(d

环境: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>

函数r4onload(){
//获取服务器时间:
var st=document.getElementById('lblLastLoaded').innerHTML;
//日期时间偏移
//st的格式为YYYY/MM/dd HH:MM:ss-HH:MM
//                       1         2
//             012345678901234567890123456
//例如2020/09/29 10:31:56-07:00
设dto={};
dto.year=数量(st.substring(0,4));
dto.month=编号(st.substring(5,7));
dto.day=数量(st.substring(8,10));
dto.hour=数量(st.substring(11,13));
dto.minute=数字(st.substring(14,16));
var offsetHour=Number(st.substring(20,23));//如果这4行被注释掉,则可以使用
var offsetMinutes=Number(st.substring(24,26));//如果这4行被注释掉,则可以使用
dto.offset=offsetHour*60+Math.sign(offsetHour)*offsetMinutes;//如果这4行被注释掉,则有效
//dto.offset正确计算为-420分钟//如果注释掉这4行,则有效
var pst=luxon.DateTime.fromObject(dto);
//pst在这一点上还没有定义——为什么??
//如果我没有包括任何关于上述偏移的内容(注释掉4行
//包含offsetHours、offsetMinutes和dto.Offset,然后pst显示如下:
//2020-09-29T10:31:00.00000-07:00
//也就是说,luxon使用本地系统的偏移量-07:00,而不是变量st中包含的偏移量。
document.getElementById('Parsed')。innerHTML=pst;
r4startTime();
}
函数r4startTime(){
var dt=luxon.DateTime.local();
var h=dt.小时;
var m=dt.min;
var s=dt.秒;
m=R4检查时间(m);
s=R4检查时间(s);
document.getElementById('CurrTime').innerHTML=
h+“:“+m+”:“+s;
var t=设置超时(r4startTime,2000);
}
函数r4checkTime(i){
如果(i<10){i=“0”+i};//在<10的数字前面加零
返回i;
}
完整的Visual Studio 2017项目DemoLuxon,包含文件站点中的上述代码段。Master位于以下位置:


如果上述方法不太合适,我将非常感谢您提出更优雅的方法来确定客户机/服务器偏移差异。

我设计了一种解决方法,如下所示,但原始问题尚未得到解决:

    <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>

函数r4onload(){
var st=document.getElementById('lblLastLoaded').innerHTML;
//日期时间偏移
//st的格式为YYYY/MM/dd HH:MM:ss-HH:MM
//                       1         2
//             012345678901234567890123456
//例如2020/09/29 10:31:56-07:00
//转换为ISO格式:
st=st子串(0,4)+'-'+st子串(5,7)+'-'+st子串(8,10)
+‘T’+st子串(11,19)+“.000”+st子串(20);
document.getElementById('Xformed')。innerHTML=st;
var pst=luxon.DateTime.fromso(st,{setZone:true});
document.getElementById('Parsed')。innerHTML=pst;
r4startTime();
}
函数r4startTime(){
var dt=luxon.DateTime.local();
var h=dt.小时;
var m=dt.min;
var s=dt.秒;
m=R4检查时间(m);
s=R4检查时间(s);
document.getElementById('CurrTime').innerHTML=
h+“:“+m+”:“+s;
var t=设置超时(r4startTime,2000);
}
函数r4checkTime(i){
如果(i<10){i=“0”+i};//在<10的数字前面加零
返回i;
}
i、 例如,首先将日期时间转换为ISO格式,然后使用luxon.DateTime.fromISO。变量pst获取正确的日期时间值,包括偏移量。带有偏移量的luxon.DateTime.fromObject的问题仍未解决