添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

app.UseRequestLocalization(options =>
options.RequestCultureProviders = options.RequestCultureProviders.Where(a => !(a is AcceptLanguageHeaderRequestCultureProvider)).ToList();
options.SetDefaultCulture("zh-Cn");
码上有钱(why)

var options = new RequestLocalizationOptions
    DefaultRequestCulture = new RequestCulture("zh-CN"),
    SupportedCultures = new[] { new CultureInfo("zh-CN") },
    SupportedUICultures = new[] { new CultureInfo("zh-CN") }
return app.UseRequestLocalization(options);

@剑剑~: 可以修改 th-TH Culture 的日期格式

var zhCnCulture = new CultureInfo("zh-CN");
var thCulture = new CultureInfo("th-TH");
thCulture.DateTimeFormat = new CultureInfo("zh-CN").DateTimeFormat;
var options = new RequestLocalizationOptions
    DefaultRequestCulture = new RequestCulture("zh-CN"),
    SupportedCultures = new[] { zhCnCulture, thCulture },
    SupportedUICultures = new[] { zhCnCulture, thCulture }
app.UseRequestLocalization(options);
                                园豆:31030
                                (高人七级)
                                2023-06-08 18:45

@dudu: 非常感谢,满足我的需要,还想请教一下,在现有基础上(用了这种多语言),如果要做根据多语言(请求头中的Accept-Language=th-TH),来做多时区自动处理(比如泰语则时间自动减一小时时差),这种有推荐方法吗

园豆:167 (初学一级) 2023-06-09 10:29

这个问题可能是因为多语言环境引起的。在使用多语言包时,如果没有正确设置本地化信息,可能会导致 DateTime.Now 将当前时间按照一个不正确的本地化格式显示。

为了解决这个问题,您需要在.NET Core 6应用程序中设置正确的本地化信息。可以通过更改应用程序的全局配置来实现这一点。

您可以在 Program.cs 中添加以下代码:

using System.Globalization;
var culture = new CultureInfo("th-TH"); // 使用泰语(泰国)区域信息
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture; 

在您的.NET Core 6应用程序启动时,在 Main 方法的开头添加上述代码即可。当您设置了正确的区域性后,DateTime.Now 将以正确的本地化格式显示时间,以便在响应客户端请求时正确显示日期和时间。

需要注意的是,将本地化信息设置为 "th-TH" 可以解决从泰国访问应用程序的问题,但如果有其他区域的客户端访问您的应用程序,则需要根据他们的偏好设置动态地更改本地化信息。

@剑剑~: 如果您想要在.NET Core 6应用程序中显示北京时间,而不是基于当前客户端区域性的本地化时间,请使用以下代码将 DateTime.Now 转换为北京时间。

using System;
using System.Globalization;
// 设置区域性信息为中国标准时间(UTC+8)
var culture = new CultureInfo("zh-CN");
culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
culture.DateTimeFormat.LongTimePattern = "HH:mm:ss";
culture.DateTimeFormat.TimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture; 
// 将当前时间转换为中国标准时间
var chinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
var utcNow = DateTime.UtcNow;
var localTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, chinaTimeZone);
Console.WriteLine(localTime.ToString());

在上述代码中,我们首先使用 TimeZoneInfo.FindSystemTimeZoneById 方法找到中国标准时间的时区信息,并在全局设置中使用它。然后,我们使用 DateTime.UtcNow 获取世界协调时(UTC)时间,并使用 TimeZoneInfo.ConvertTimeFromUtc 将其转换为中国标准时间。

支持(0) 反对(0) lanedm 园豆:2396 (老鸟四级) 2023-06-08 17:57 static IHostBuilder CreateHostBuilder() => Host.CreateDefaultBuilder() .ConfigureServices((hostContext, services) => // 可以在此处注入服务 .ConfigureLogging(logging => // 可以在此处配置日志记录 .UseConsoleLifetime() .UseSystemd() .UseEnvironment("Production") .UseContentRoot(AppDomain.CurrentDomain.BaseDirectory) .UseDefaultServiceProvider(options => options.ValidateScopes = false) .UseConsoleLifetime() .UseSystemd() .ConfigureHostConfiguration(configHost => // 可以在此处配置主机设置 .ConfigureAppConfiguration((hostContext, configApp) => // 可以在此处配置应用程序设置 .UseConsoleLifetime() .UseSystemd() .ConfigureServices((hostContext, services) => // 可以在此处配置依赖注入 .UseConsoleLifetime() .UseSystemd() .ConfigureWebHostDefaults(webBuilder => // 在此处使用 IOC 注入服务 .ConfigureAppConfiguration(config => // 配置应用程序设置 .ConfigureLogging(logging => // 配置日志记录系统 // 设置区域性信息为中国标准时间(UTC+8) .UseCulture(new CultureInfo("zh-CN")) .ConfigureServices((hostContext, services) => // 可以在此处注册服务 // 全局替换当前时间的实现 .ConfigureServices(services => services.AddSingleton(new Func<DateTime>(() => TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))); 支持(0) 反对(0) lanedm 园豆:2396 (老鸟四级) 2023-06-08 18:04 static IHostBuilder CreateHostBuilder() => Host.CreateDefaultBuilder() .ConfigureAppConfiguration((hostingContext, config) => // 应用程序配置 .ConfigureServices((hostContext, services) => // 服务依赖注入 .UseConsoleLifetime() .ConfigureWebHostDefaults(webBuilder => // Web 主机配置 // 设置 CHINA STANDARD TIME 作为默认时区, .UseTimeZone("China Standard Time") // 将 UI 区域设置为泰语 .UseUICulture(new CultureInfo("th-TH")) .ConfigureServices(services => // 注册时间获取服务 services.AddSingleton(new Func<DateTime>(() => TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"))));

此时,应用程序的时间将会以北京时间和格式显示,同时显示泰语用户界面。

支持(0) 反对(0) lanedm 园豆:2396 (老鸟四级) 2023-06-08 19:06

在 .NET 6 项目中,你可以通过修改默认的时区设置来解决日期时间格式不正确的问题。以下是一种可能的解决方案:

打开 Program.cs 文件,找到 CreateHostBuilder 方法。
在该方法中,添加以下代码来设置应用程序的默认时区为北京时间(GMT+8):
csharp
Copy code
using System;

// ...

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
DateTime now = TimeZoneInfo.ConvertTime(DateTime.Now, timeZoneInfo);
services.AddSingleton(now);
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>();
上述代码使用 TimeZoneInfo.ConvertTime 方法将当前时间转换为指定时区("Asia/Shanghai")的时间,并将其注入到 DI(依赖注入)容器中。这样,在整个应用程序中,你可以通过在构造函数或方法中注入 DateTime 对象来获取北京时间。

请注意,Asia/Shanghai 是表示中国标准时间(北京时间)的时区标识符。如果你所在的时区不是北京时间,可以根据需要替换为相应的时区标识符。

通过上述的全局处理,你可以在整个应用程序中使用注入的 DateTime 对象来获取北京时间,而不需要单独处理每个 DateTime.Now 的调用。

希望这可以解决你的问题。如果你有其他疑问,请随时提问。