如何将day(一周中的哪一天)和time作为字符串转换为.net中的不同时区

本文关键字:字符串 转换 时区 net time day 一周 一天 | 更新日期: 2023-09-27 17:55:06

我必须将各种数量的字符串转换为本地时区(.ToLocalTime()),但与正常的DateTime字符串不同,这些字符串只包含日期和时间(它们应该是UTC),如下所示:

SUNDAY:17:00 
FRIDAY:16:50
MONDAY:20:50
THURSDAY:07:00

我正在寻找一个聪明的方法来"转换"这些字符串到本地时区,但因为我不能得到一个DateTime,我将不得不手动去做,我想避免。(我也不想分割字符串…)

如何将day(一周中的哪一天)和time作为字符串转换为.net中的不同时区

如果不知道确切的日期,就不能正确处理TimeZoneOffset,因为偏移量可能从一天变化到另一天(DST与非DST)。

获得正确的时间是容易的部分(如果您有正确的日期),只需使用适当的DateTime构造函数。

DateTime(int year, int month, int day, int hour, int minute, int second, System.DateTimeKind kind)

,并指定类型为System.DateTimeKind.Utc。然后你有你的时间戳作为一个UTC时间,然后你可以使用ToLocalTime()来获得正确的时间在你的当地时区。

对我来说,最难的部分似乎是从你的数据中得到正确的日期。指的是下一个星期日(即2016-07-10)还是上一个星期日(2016-07-03)?这对于接近夏令时开关的日期尤其重要,因为这可能导致不同的时间戳。

还要注意,在某些时区'SUNDAY:23:00' UTC可能会变成'MONDAY:01:00'(反之亦然)!因此,您必须根据UTC而不是您的本地时间来计算日期。例如,如果在当地时间是星期一2016-07-04 01:00,但在UTC时间是星期日2016-07-03 23:00,那么使用当地时间解释时间戳Sunday:17:00(并想要下一个星期日)将导致2016-07-10 19:00而不是2016-07-03 19:00。

您可以使用DateTime构造函数来创建日期并将其转换为普通的DateTime,不是吗?

检查此示例,并替换为您需要的内容。

var theDate = new DateTime (DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, hours, minute, second);

From the doc:

public DateTime(
    int year,
    int month,
    int day
)
DateTime date1 = new DateTime(2010, 8, 18);
Console.WriteLine(date1.ToString());
// The example displays the following output:
//      8/18/2010 12:00:00 AM