首页 > 解决方案 > 如何使用 .NET 核心获取“以 UTC 表示的今天当地午夜”?

问题描述

我正在尝试使用 .NET Core 获取“UTC 本地午夜”的时间戳。

我写了这段代码:

var utcTimeStartLocalDay =
            TimeZoneInfo.ConvertTimeToUtc(convertToLocalTimezone(DateTime.UtcNow).Date);

在哪里

public DateTime ConvertToLocalTimezone(DateTime dateTime)
{
    return TimeZoneInfo.ConvertTime(dateTime, TimeZoneInfo.Utc,TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
}

因此,想法是获取 Utc 时间戳,将其转换为本地 TZ,然后获取 Date(即丢弃时间部分并有效地制作午夜时间戳)并转换回 Utc - 这应该给我本地时间。

但是,它并没有发生,因为第一个表达式的结果是打印时的 Utc 午夜。

小提琴:https ://dotnetfiddle.net/wJIXve

我需要在这里更正什么才能得到以 UTC 表示的当天当地午夜的答案(类似于前一天 22:00 UTC)?

编辑:只是为了澄清问题中的一个不清楚之处:“本地” TZ 我的意思是已知的本地时区(在代码中找到)

标签: c#datetimeasp.net-coretime.net-core

解决方案


为确保您绝对使用当地时间,我将使用以下代码:

DateTime localMidnight = DateTime.SpecifyKind(DateTime.Now.Date, DateTimeKind.Local);

然后只需使用.ToUniversalTime()获取 UTC 日期:

DateTime localMidnightUtc = localMidnight.ToUniversalTime();

这是一个工作示例:

static async Task Main(string[] args)
{
    DateTime localMidnight = DateTime.SpecifyKind(DateTime.Now.Date, DateTimeKind.Local);
    DateTime localMidnightUtc = localMidnight.ToUniversalTime();

    Console.WriteLine($"localMidnight:    {localMidnight}");
    Console.WriteLine($"localMidnightUTC: {localMidnightUtc}");
}

// Output:
// localMidnight:    29.01.2020 00:00:00
// localMidnightUTC: 28.01.2020 23:00:00

(现在你知道我在哪个时区了;)


推荐阅读