日期时间转字符串总是默认系统时区偏移量,需要在结果中获取用户时区偏移量

Convert datetime to string always defaults to system time zone offset, Need to get the users timezone offset in the result

我有一个代码,用户可以在其中输入日期时间和日期需要转换成的时区以及结束日期的格式。下面是代码。

代码将 DateTime 完美转换为用户输入的时区,但在格式化 Datetime 时,日期时间偏移值始终默认为系统时区偏移。 例如,当我将日期 2014-10-30T08:01:01-06:00(central time) 转换为太平洋标准时间并对其进行格式化时。 结果是 2014-10-30T06:01:01**-06:00** ,应该是 2014-10-30T01:01:01**-08:00** 偏移值默认为系统时区,即中央时间。

    DateTime inputtime;
    string TimezoneID;
    String outputdateformat;
inputtime = "2014-10-30T08:01:01-05:00"
TimezoneID ="Pacific Standard Time".
Outputdateformat ="yyyy-MM-ddThh:mm:ss zz"

DateTime finaloutputtime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(inputtime,TimezoneID);

string FinalFormattedDate =finaloutputtime.toString(outputdateformat);

您可以使用 DateTimeOffset 而不是 DateTime 来处理此问题:

            DateTimeOffset time = DateTime.Now;
            string timezoneID = "Pacific Standard Time";
            TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(timezoneID);

            DateTimeOffset newTIme = TimeZoneInfo.ConvertTime(time, info);


            string timeformat = newTIme.ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz");
            string oldtimeformat = time.ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz");

如果要将 DateTimeOffset 转换为另一个 DateTimeOffset,可以使用 TimeZoneInfo 中的专用函数

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));

或者你可以这样做

DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);


TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard   Time");

// it's a simple one-liner
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);