ASP.NET Razor是否本地运行?全球时间本地化项目DateTime过滤问询
问题1:ASP.NET Razor是否在本地运行?
嘿,这个得给你掰扯清楚:ASP.NET Razor是服务器端的视图引擎,它的代码都是在服务器上运行的,根本不在用户的本地浏览器里执行。
举个例子:当你访问一个Razor页面时,服务器会先把你写的那些@{ ... }代码块执行一遍,把逻辑处理完,然后把最终生成的HTML、CSS、JS这些客户端能读懂的内容,发送到用户的本地浏览器显示。所以你在Razor里写的C#逻辑,都是服务器端干完活之后,才把结果给到本地的。
问题2:全球时间本地化项目的日期时间过滤处理
先给你点出你原有思路里的坑:你想在Razor代码里用DateTime.UtcNow.ToLocalTime()来过滤,这个ToLocalTime()转的是服务器的本地时间,不是用户浏览器所在时区的本地时间!比如你的服务器部署在UTC+8的北京,那不管用户在UTC-5的纽约还是UTC+0的伦敦,过滤出来的结果都是基于北京的时间,这完全不符合你“全球时间本地化”的需求。
下面给你两种靠谱的解决方案,你根据自己的场景选:
方案一:服务器端过滤(适合数据量大的场景)
如果数据量很大,不想把所有交易数据都传到前端,那得让前端把用户的时区信息传给服务器,然后服务器基于用户的时区来处理过滤:
- 前端用JS获取用户的时区偏移量(注意
getTimezoneOffset()返回的是UTC减去本地时间的分钟数,所以要反转一下):
const timezoneOffset = new Date().getTimezoneOffset(); // 把这个偏移量作为参数传给后端,比如通过URL查询参数或者表单
- 服务器端接收这个偏移量,计算出用户本地时间对应的UTC时间,再和数据库里的UTC时间比较(因为数据库存的是UTC,直接用UTC比较最准确):
// 假设从请求中拿到用户的时区偏移量 if (int.TryParse(Request.Query["timezoneOffset"], out var userTimezoneOffset)) { // 计算用户本地当前时间对应的UTC时间 var userLocalNowInUtc = DateTime.UtcNow.AddMinutes(-userTimezoneOffset); // 过滤:数据库的CreatedDateTime是UTC,直接和userLocalNowInUtc比较 foreach(var financialTransaction in Model.FinancialTransactionRows.Where(ft => ft.CreatedDateTime < userLocalNowInUtc)) { // 执行你的操作 } }
方案二:前端过滤(适合数据量小的场景)
如果数据量不大,直接把所有UTC数据传到前端,用JS处理过滤会更简单,而且完全基于用户的本地时区:
- Razor把UTC时间以ISO格式输出(这种格式JS能直接解析):
// 把交易序列化成JSON传给前端 <script> const transactions = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Model.FinancialTransactionRows)); // 获取用户本地当前时间 const now = new Date(); // 过滤:把UTC时间转成用户本地时间,再和当前时间比较 const filteredTransactions = transactions.filter(transaction => { // JS会自动把UTC格式的字符串转成本地时间 const createdTime = new Date(transaction.CreatedDateTime); return createdTime < now; }); // 接下来就可以渲染过滤后的结果了 </script>
总结一下:核心就是别把服务器的时区当成用户的时区,要么让前端传时区信息给服务器处理,要么直接在前端用JS处理时区转换和过滤,这样才能满足全球不同用户的本地化需求。
内容的提问来源于stack exchange,提问作者TimTam
相关产品推荐
相关产品推荐

