我有一个运行在docker-compose
应用程序中的.NET Core 2.2 Web应用程序。我将不同的UTC时间戳保存到数据库中,如下所示:
//set asked state on question
Question questionInDb = c.Questions.Single(x => x.Id == id);
questionInDb.Asked = true;
questionInDb.AskTime = DateTime.UtcNow;
c.SaveChanges();
在apppsettings.json
中,我有一个关于我的应用程序设置的部分,其中包含应该在其上运行该应用程序的语言环境。我将CultureInfo.CurrentCulture
设置为:
//get locale from settings, defaulting to de-DE
string locale = "de-DE";
locale = Configuration.GetValue<string>("AppSettings:Locale");
var ci = new CultureInfo(locale, false);
//actually setting locale
CultureInfo.CurrentCulture = ci;
我设置了实体框架,将所有DateTime
都设置为DateTimeKind.Utc
,因此应用程序知道所获取的DateTime
都是UTC。
现在,在视图上显示时间时,该时间不正确。在view.cshtml
中,我使用的是@q.AskTime.ToString("HH:mm:ss dd.MM.yy")
,但是它总是从数据库中返回确切的值。应该多显示一小时。
我什至尝试使用ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
(在我的docker-compose
中将环境变量TZ
设置为Europe/Berlin
)将容器的时区设置为CET(中欧时间)。 / p>
我没主意了。
答案 0 :(得分:0)
Cultures(也称为语言环境)用于显示和格式化数据,与时区的概念不同。您可以从时区名称中找到并创建特定的TimeZoneInfo
,并使用ConvertTimeFromUtc()
方法转换UTC日期和时间。
请记住,不同的操作系统使用不同的时区名称。例如,对于Linux,您可以使用Europe/Berlin
;对于Windows,您可以使用Central Europe Standard Time
。
示例:
TimeZoneInfo tz;
try
{
// Linux
tz = TimeZoneInfo.FindSystemTimeZoneById("Europe/Berlin");
}
catch (TimeZoneNotFoundException)
{
try
{
// Windows
tz = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");
}
catch (TimeZoneNotFoundException)
{
// Fallback to UTC
tz = TimeZoneInfo.Utc;
}
}
var converted = tz.ConvertTimeFromUtc(DateTime.UtcNow);