ASP.NET Razor Pages应用在iPhone上DateTime格式显示异常求助
开发的Razor Pages Web应用中,DateTime数据在桌面浏览器(含移动端模拟)显示正常,但在iPhone的Safari/Chrome浏览器中格式不一致:
- 桌面端显示:
2024-06-15 11:25:54 PM - iOS移动端显示:
2024-06-15 11:25:54 p.m
已在program.cs中配置en-CA文化及自定义DateTimeFormatInfo(设置AMDesignator = "AM"、PMDesignator = "PM"),但移动端无变化。应用部署在IIS上,Razor Page中直接输出DateTime的代码如下:
@foreach (Command command in Model.Commands.OrderByDescending(u => u.DateCreated)) { <tr> <td> <span class="text-black text-opacity-75" style="font-size: 14px;">@command.DateCreated</span> </td> </tr> }
通过Keyoti扩展调试时iOS设备显示正常,输出当前CultureInfo发现:桌面端Chrome的AMDesignator为"AM",移动端Chrome/Safari的AMDesignator为"a.m."且DateTimeFormat为默认值;将iOS Safari语言改为英语(UK)后,DateTime格式显示正确。
ASP.NET Core默认会根据客户端浏览器发送的Accept-Language请求头自动设置当前请求的文化。iOS设备的Safari/Chrome可能发送了带有特定子文化的语言头(比如en-US或其他与en-CA格式不同的文化),导致服务器端使用了客户端传递的文化,而非代码中配置的默认en-CA文化。
Keyoti调试时未发送真实的客户端语言头,因此使用了代码中配置的默认文化,显示正常;修改iOS Safari语言为英语(UK)后,发送的Accept-Language对应en-GB文化,其AM/PM格式为"AM"/"PM",因此显示正确。
方案1:强制全局使用指定文化,忽略客户端语言头
在Program.cs中配置请求本地化选项时,清空默认的文化检测提供器,强制使用指定的en-CA文化:
builder.Services.Configure<RequestLocalizationOptions>(options => { var enCaCulture = new CultureInfo("en-CA"); // 自定义DateTime格式(按需调整) enCaCulture.DateTimeFormat.AMDesignator = "AM"; enCaCulture.DateTimeFormat.PMDesignator = "PM"; enCaCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"; enCaCulture.DateTimeFormat.LongTimePattern = "hh:mm:ss tt"; options.DefaultRequestCulture = new RequestCulture(enCaCulture); options.SupportedCultures = new[] { enCaCulture }; options.SupportedUICultures = new[] { enCaCulture }; // 移除默认的客户端文化检测提供器,强制使用默认文化 options.RequestCultureProviders.Clear(); }); // 在管道中启用请求本地化 app.UseRequestLocalization();
方案2:显式指定DateTime输出格式/文化
在Razor Page中输出DateTime时,直接指定格式和文化,不依赖当前请求的文化:
@command.DateCreated.ToString("yyyy-MM-dd hh:mm:ss tt", new CultureInfo("en-CA"))
方案3:检查IIS应用池区域设置
确保IIS应用池的区域设置与代码配置一致:
- 打开IIS管理器,找到对应应用池
- 右键选择“高级设置”
- 在“进程模型”下找到“加载用户配置文件”,设置为
True - 确保服务器系统的区域设置为en-CA(若需要)
内容的提问来源于stack exchange,提问作者kj49

