服务器中的日期时间冲突 (dd/mm/yyyy)

问题描述

当我将我的剃刀页面应用程序上传到服务器时,总是收到此错误“值 '14/09/2022' 对 ...* 无效。”我可以找出问题,格式被解释为 mm/dd/yyyy。我无法更改服务器的系统日期格式。

所以我所做的是通过 IIS 管理器更改了我的应用程序文化和 UI 文化。

enter image description here

即使在更改之后,它仍然显示相同的问题。我使用 Bootstrap 日期选择器。 任何帮助将不胜感激。谢谢。

已编辑

Startup.cs

public class CustomDateConverter : JsonConverter<DateTime>
        {
            public override DateTime Read(ref Utf8JsonReader reader,Type typetoConvert,JsonSerializerOptions options)
            {
                Debug.Assert(typetoConvert == typeof(DateTime));
                return DateTime.Parse(reader.GetString());
            }

            public override void Write(Utf8JsonWriter writer,DateTime value,JsonSerializerOptions options)
            {
                writer.WriteStringValue(value.ToUniversalTime().ToString("dd'/'mm'/'yyyy"));
            }
        }

public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();

            services.AddDbContext<ApplicationDbContext>(options =>
                    options.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddDebug()))
                    .UsesqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddSession(options => {
                options.IdleTimeout = TimeSpan.FromMinutes(30);
                options.Cookie.HttpOnly = true;
                options.Cookie.IsEssential = true;
            });
            services.AddRazorPages().AddJsonoptions(options =>{
                options.JsonSerializerOptions.Converters.Add(new CustomDateConverter());
            });
            services.AddMemoryCache();
        }

解决方法

您应该以 ISO 8601 格式将日期发布到服务器,即 yyyy-mm-dd。如果您想在日期选择器中使用不同的格式,您可以使用隐藏字段以 yyyy-mm-dd 格式存储日期版本。您可以使用日期选择器的 onchange 事件来填充隐藏字段。

或者,如果您可以将浏览器限制为 Chrome、Edge 或 Opera,则可以只使用 HTML5 输入 type="datetime-local"

https://www.mikesdotnetting.com/article/352/working-with-dates-and-times-in-razor-pages-forms

,

在服务器端设置日期时间格式的理想解决方案是在启动时设置本地化设置:

services.Configure<RequestLocalizationSettings>(ops => 
{
    var cultures = new CultureInfo[] { new CultureInfo("en-GB") }
    ops.SupportedCultures = cultures;
    ops.SupportsUICultures = cultures;
    ops.DefaultRequestCulture = new RequestCulture("en-GB");
});

然后使用本地化中间件:

app.UseRequestLocalization();

或者您可以为特定页面手动设置日期格式:

var myCulture = new CultureInfo("en-GB");
myCulture.DateTimeFormat.ShortDatePattern = "dd/mm/yyyy";

CultureInfo.DefaultThreadCurrentCulture = myCulture;
CultureInfo.DefaultThreadCurrentUICulture = myCulture;

或者您可以创建一个 custom converter 并对其进行全局配置:

services.AddRazorPages()
    .AddJsonOptions(options =>
    {
        ops.JsonSerializerOptions.Converters.Add(new CustomDateConverter()));
    });

当然也不要忘记在 bootstrap datetime picker 中设置日期格式:

$('.datepicker').datetimepicker({
    format: 'dd/mm/yyyy'
});