首页 新闻 会员 周边

.net C#获取当前时间格式不正确,求教

0
悬赏园豆:15 [已解决问题] 解决于 2023-06-12 17:53

.net6的项目,引用了多语言包,请求头改成泰语后,DateTime.Now取出的时间就不对劲了,要怎么解决。。。


问题补充:

因为数据分库,要进行日期拼接去查不同数据库,所以想要北京时间格式。项目中有很多datetime.now ,单个处理不现实,这里可以全局处理datetime.now让他变成北京时间吗

剑剑~的主页 剑剑~ | 初学一级 | 园豆:167
提问于:2023-06-08 17:26

app.UseRequestLocalization(options =>
{
options.RequestCultureProviders = options.RequestCultureProviders.Where(a => !(a is AcceptLanguageHeaderRequestCultureProvider)).ToList();
options.SetDefaultCulture("zh-Cn");
});

码上有钱(why) 10个月前
< >
分享
最佳答案
0

试试加上下面的代码

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);
收获园豆:15
dudu | 高人七级 |园豆:31003 | 2023-06-08 17:42


这个加过了,好像没啥用。。。

剑剑~ | 园豆:167 (初学一级) | 2023-06-08 17:50

@剑剑~: 你想使用什么时间格式?

dudu | 园豆:31003 (高人七级) | 2023-06-08 17:57

@dudu: 北京时间,比如能把今天是20230608抓出来就行,项目里面用了很多dateTime.Now,我单独一个个去处理泰国时间不太现实,想问问有没有其他办法

剑剑~ | 园豆:167 (初学一级) | 2023-06-08 18:02

@剑剑~: 上面的回答中的代码就是强制使用 zh-CN Culture

dudu | 园豆:31003 (高人七级) | 2023-06-08 18:14

@dudu: 可是用上面的方法国际化翻译语言就没用了,裂开

剑剑~ | 园豆:167 (初学一级) | 2023-06-08 18:25

@剑剑~: 可以修改 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);
dudu | 园豆:31003 (高人七级) | 2023-06-08 18:45

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

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

@剑剑~: 可以考虑使用 DateTimeOffset,参考:

dudu | 园豆:31003 (高人七级) | 2023-06-09 11:18
其他回答(2)
0

这个问题可能是因为多语言环境引起的。在使用多语言包时,如果没有正确设置本地化信息,可能会导致 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" 可以解决从泰国访问应用程序的问题,但如果有其他区域的客户端访问您的应用程序,则需要根据他们的偏好设置动态地更改本地化信息。

lanedm | 园豆:2378 (老鸟四级) | 2023-06-08 17:44

刚在项目Program文件添加了这些,但是还是获取到的泰国时间,我想显示北京时间

支持(0) 反对(0) 剑剑~ | 园豆:167 (初学一级) | 2023-06-08 17:55

@剑剑~: 如果您想要在.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 | 园豆:2378 (老鸟四级) | 2023-06-08 17:57

@剑剑~: 以下是一个.NET Core 6控制台应用程序的示例代码:

using Microsoft.Extensions.Hosting;
using System;
using System.Globalization;

namespace BeijingTimeExample
{
    class Program
    {
        static void Main()
        {
            // 启动应用程序
            CreateHostBuilder().Build().Run();
        }

        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 | 园豆:2378 (老鸟四级) | 2023-06-08 18:04

@lanedm: 这样时间没问题,但是影响国际化,返回数据不是泰语了

支持(0) 反对(0) 剑剑~ | 园豆:167 (初学一级) | 2023-06-08 18:16

@剑剑~:

using Microsoft.Extensions.Hosting;
using System;
using System.Globalization;

namespace MyApplication
{
    class Program
    {
        static void Main()
        {
            // 启动应用程序
            CreateHostBuilder().Build().Run();
        }

        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 | 园豆:2378 (老鸟四级) | 2023-06-08 19:06

@剑剑~: 就设置一下时区不就可以了

支持(0) 反对(0) 摸鱼w | 园豆:250 (菜鸟二级) | 2023-06-09 11:36
0

在 .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 的调用。

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

Technologyforgood | 园豆:5575 (大侠五级) | 2023-06-08 23:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册