You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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应用池的区域设置与代码配置一致:

  1. 打开IIS管理器,找到对应应用池
  2. 右键选择“高级设置”
  3. 在“进程模型”下找到“加载用户配置文件”,设置为True
  4. 确保服务器系统的区域设置为en-CA(若需要)

内容的提问来源于stack exchange,提问作者kj49

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:31:12