ASP.NET Core 应用程序上的错误日期时间格式

Posted

技术标签:

【中文标题】ASP.NET Core 应用程序上的错误日期时间格式【英文标题】:Wrong datetime format on ASP.NET Core application 【发布时间】:2021-02-19 13:22:21 【问题描述】:

我想在 ASP.NET Core 应用程序上设置相同的日期时间格式 (pl-PL)。我在我的配置中使用 pl-PL 文化:

        services.Configure<RequestLocalizationOptions>(options =>
        
            var supportedCultures = new[]
            
                new CultureInfo("pl-PL"),
            ;
            options.DefaultRequestCulture = new RequestCulture("pl-PL", "pl-PL");
            options.DefaultRequestCulture.Culture.DateTimeFormat.FullDateTimePattern = "dd.MM.yyyy HH:mm:ss";
            options.DefaultRequestCulture.Culture.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
            options.DefaultRequestCulture.UICulture.DateTimeFormat.FullDateTimePattern = "dd.MM.yyyy HH:mm:ss";
            options.DefaultRequestCulture.UICulture.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
            

            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;

        );

这还不够。我仍然有绑定日期的问题,例如。 01.02.2013 绑定为 02.01.2013。 因此我编写了自定义活页夹:

public class DateTimeModelBinder : IModelBinder

    public Task BindModelAsync(ModelBindingContext bindingContext)
    
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        // Try to fetch the value of the argument by name
        var modelName = bindingContext.ModelName;
        var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
        if (valueProviderResult == ValueProviderResult.None)
            return Task.CompletedTask;

        bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);

        var dateStr = valueProviderResult.FirstValue;
        // Here you define your custom parsing logic, i.e. using "pl-PL" culture

        
        if (!DateTime.TryParse(dateStr, new CultureInfo("pl-PL"), DateTimeStyles.None, out date))
        
              bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "Data powinna być w formacie 'dd.MM.yyyy HH:mm:ss'");
              return Task.CompletedTask;
        
            

        bindingContext.Result = ModelBindingResult.Success(date);
        return Task.CompletedTask;
    

它开始工作,但只是在本地(在具有波兰操作系统的计算机上)。我发现 Culture('pl-PL') 在生产服务器上必须不同(但我不知道为什么)。所以,我决定补充:

if (!DateTime.TryParseExact(dateStr, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
            
                if (!DateTime.TryParseExact(dateStr, "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                
                    if (!DateTime.TryParseExact(dateStr, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                    
                        if (!DateTime.TryParse(dateStr, new CultureInfo("pl-PL"), DateTimeStyles.None, out date))
                        
                            bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "Data powinna być w formacie 'dd.MM.yyyy HH:mm:ss'");
                            return Task.CompletedTask;
                        
                    
                
            

此解决方案有效,但丑陋。 同样重要的是,我注意到不同浏览器之间的数据格式看起来不同。 在 Firefox 上:Od:19.02.2021 Do:05.03.2021(正确) 在 Chrome 上:Od:2021-02-19 Do:2021-03-05(错误)

在表示层返回日期的代码:

<div class="col-sm-3">
Od: @vehicleAvailability.DateFrom.ToShortDateString()
Do: @vehicleAvailability.DateTo.ToShortDateString()
</div>

【问题讨论】:

“Culture('pl-PL') 在生产服务器上必须不同”——这甚至意味着什么?以及如何向 api 提出请求?来自form 还是使用javascript?您是否可以添加 api 代码来返回数据以显示此 在 Firefox 上:Od:19.02.2021 Do:05.03.2021(正确)在 Chrome 上:Od:2021-02-19 Do:2021-03- 05(错误) @Alexander 通过表单。我知道这听起来很有趣。我添加了日志记录以检查生产服务器上的错误:解析前的 dateStr 和解析后的 date.ToString()。 dateString 等于 01.02.2013 但解析后日期是错误的。 @Alexander 我添加了显示帖子日期的代码。 【参考方案1】:

在您的情况下,Chrome 和 Firefox 之间的区别在于它们发送不同的 Accept-Language 标头,您可以在网络选项卡中查看。如果要显示特定的日期格式,请考虑在 DateTime.ToString 中指定区域性

<!-- ToShortDateString() equals ToString("d") -->
<div class="col-sm-3">
Od: @vehicleAvailability.DateFrom.ToString("d", new CultureInfo("pl-PL")) 
Do: @vehicleAvailability.DateTo.ToString("d", new CultureInfo("pl-PL"))
</div>

【讨论】:

可以全局转吗?我想为应用程序中的所有地方设置相同的文化。 @marmite 实际上,您发布的代码将应用程序限制为单个受支持的文化,即pl-PL,因此使用此设置的不同浏览器实际上不会有不同的结果。你有额外的本地化代码吗? UseRequestLocalization 中还有其他内容吗? 你是对的!我删除了“app.UseRequestLocalization();”它有助于消除。但我仍然有绑定问题:/

以上是关于ASP.NET Core 应用程序上的错误日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章

IIS Express 10 上的 ASP.NET Core 应用程序给出 HTTP 500 错误

部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误

IIS 错误 502.5 上的 ASP.NET Core 1.0

Firefox 上的 ASP.NET Core Web API CORS 错误,但在 Chrome 上没问题

HTTP 错误 500.31 - 无法加载 ASP.NET Core 运行时

如何在 Asp.Net Core 中为日期绑定设置文化?