显示正确时区的时间

时间:2019-01-08 11:33:09

标签: c# datetime asp.net-core docker-compose

我有一个运行在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>

我没主意了。

1 个答案:

答案 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);