C#获取特定时区的午夜时间(UTC)

6
我希望获取特定时区在UTC下的午夜时间。例如,假设我的本地机器时区为+05:30。请参见下面的屏幕截图。我使用https://www.epochconverter.com/网站进行转换。

enter image description here

在上面的例子中,我输入午夜时间为+05:30,它会给出相应的UTC时间。

注意:我正在将我的机器时区重置为(UTC)协调世界时。

因此,我想要找到的是那个UTC日期时间。为此,我已经存储了用户时区信息。我使用下面的代码获取时区信息。
TimeZoneInfo userTz = TimeZoneInfo.FindSystemTimeZoneById(LoginSessionDO.TimeZoneId);

所以,我想在UTC中找到任何时区的午夜时间。我该如何在c#中实现?
例如:+05:30 - 2018-07-07 00:00:00 UTC- 2018-07-06 18:30:00
抱歉问题不清晰。我将解释我的场景。
编辑:我已经在Sql服务器表中存储了一些用户活动数据,其中包含dateofactivity列。所有记录的日期时间都以UTC格式存储。因此,在前端方面,我想从午夜(开始当天)获取用户的所有今天的活动记录。如果用户位于+05:30时区并且他想要获取2018年7月7日 00:00:00的所有记录,则需要传递2018年7月6日 18:30:00。现在假设另一个用户位于欧洲/阿姆斯特丹(CEST)GMT +02:00,因此想要在UTC中找到欧洲/阿姆斯特丹的午夜时间。

午夜是00:00,因此只需从午夜减去时区偏移量,这就是在您开始的任何时区午夜时UTC时间将会是什么。 - Dave
UTC不是一种格式,而是一个时区。我真的不太明白你在问什么。 - Zohar Peled
@ZoharPeled 抱歉问题没有表述清楚。如果用户处于任何时区,我想要该时区的午夜时间(UTC)。请查看我的最后一个示例。 - Ajay
@Dave,我该如何使用C#来实现这个? - Ajay
@Dave,仅使用UTC偏移量是不可行的,因为时区中还包括夏季/冬季(夏令时)时间。因此,时区偏移量到UTC在一年中可能会有所不同。 - Tomas
@Tomas 说得好。我讨厌时区。 - Dave
4个回答

8

在您所在的本地时区取得午夜时间,获取您所在时区的时区信息并调用ConvertTimeToUtc

var tz = TimeZoneInfo.FindSystemTimeZoneById("Sri Lanka Standard Time");
var midnight = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Unspecified);
var converted = TimeZoneInfo.ConvertTimeToUtc(midnight, tz);

Console.WriteLine(midnight); //2000-01-01 00:00:00
Console.WriteLine(converted);//1999-12-31 18:30:00

2
 var midNightTime = new DateTime(2018, 7, 7, 0, 0, 0);
 TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); // USE YOUR TIMEZONE INFO HERE INSTEAD.
 DateTime dateTimeInZone = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(midNightTime, timeZone.StandardName);
 DateTime universalTime = dateTimeInZone.ToUniversalTime();

如果您只是想查找偏移量,请参见此处 - 在C#中获取服务器时区偏移量


我尝试了你的代码。它给了我07-07-2018 05:30:00,这是错误的。我将时区设置为+05:30。因此,根据这个时区,我想要06-07-2018 18:30:00 - Ajay
不要将“StandardName”用作“Id”的替代品。它们是由操作系统语言本地化的,不总是匹配的。此外,您已经有一个“TimeZoneInfo”,因此可以直接使用“ConvertTimeToUtc”并将其作为参数传递。 - Matt Johnson-Pint
另外,当您将具有DateTimeKind.UnspecifiedDateTime传递给ConvertTimeBySystemTimeZoneId时,它会假定该值反映了本地时区。结果也将具有DateTimeKind.Unspecified,当您调用.ToUniversalTime()时,它将再次假定为本地时间。因此,您的代码实际上是从本地时间转换为东部时间,然后忽略它是东部时间,并再次从本地时间转换为通用时间。在大多数情况下,这不会给出正确的结果。 - Matt Johnson-Pint

1

2
并非完全正确。时区偏移量可能因日期而异。请参见时区标签wiki中的“时区!=偏移量”部分。为了首先创建正确的DateTimeOffset,需要事先知道特定的偏移量或从另一个函数派生它。 - Matt Johnson-Pint

-2

现在的UTC时间:

DateTime.UtcNow()

转换为UTC时间:

DateTime.Parse("2018-05-08 12:00:00").ToUniversalTime()

转换为本地时间:

DateTime.Parse("2018-05-08 00:00:00").ToLocalTime()

日期时间对象不知道时区。它们有本地、UTC或无三种类型,但本地不包含有关创建时所在时区的任何信息。在我看来,这使得这个答案非常脆弱。 - Dave
这并没有回答所问的问题,因为它没有使用特定的时区。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接