Blazor Server应用中JavaScript new Date()返回服务器时区偏移而非客户端的问题排查与解决咨询
Blazor Server应用中JavaScript new Date()返回服务器时区偏移而非客户端的问题排查与解决咨询
我现在遇到了一个Blazor Server应用里的时区问题,想请教大家的思路。我的应用是一个使用DxScheduler的调度系统,需要获取用户浏览器的本地时区来处理调度逻辑。
原本的思路是通过JavaScript的new Date()获取客户端的时区偏移量,再把这个值传给C#代码做后续处理。经过反复测试,C#这边的时区转换逻辑是正常工作的,但现在的核心问题是:JS代码返回的居然是服务器的时区偏移,而不是客户端的!我特意修改了服务器的时区设置,JS返回的偏移值会跟着服务器时区同步变化,这就实锤了这点。
我猜测会不会是Blazor环境把这段JS代码沙箱化了,类似Node.js的运行环境?那有没有办法让这段JS代码真正在客户端浏览器的环境里执行,而不是在服务器的沙箱中?
先贴一下我的JS代码,它放在/wwwroot目录下的独立.js文件里:
function getTimeZoneOffset() { var dateString = new Date(); var offset = dateString.getTimezoneOffset(); return offset; }
再看看调用这段JS的C#代码,现在是写在App.razor里的:
public async Task<string> CAllJS() { var offset = await JSRuntime.InvokeAsync<string>("getTimeZoneOffset"); return offset; } public async Task<TimeZoneInfo> GetUserTimeZone() { string jsNumberOfMinutesOffset = await CAllJS(); var timeZones = TimeZoneInfo.GetSystemTimeZones(); var numberOfMinutes = Int32.Parse(jsNumberOfMinutesOffset) * (-1); var timeSpan = TimeSpan.FromMinutes(numberOfMinutes); var userTimeZone = timeZones.Where(tz => tz.BaseUtcOffset == timeSpan).FirstOrDefault() ?? timeZones.First(); return userTimeZone; }
我已经尽量把逻辑拆分得独立了——调用GetUserTimeZone()的地方会把返回值赋值给一个静态类的静态属性,方便全局使用,但问题还是没解决。有没有人遇到过类似的情况,或者知道怎么让这段JS代码真正在客户端浏览器里执行,拿到正确的客户端时区偏移?
内容来源于stack exchange
相关产品推荐
相关产品推荐

