格式化用户时区的日期和日期时间,包括C#(.net)中的时区偏移

时间:2010-09-09 00:24:49

标签: c# datetime timezone utc

我正在使用C#应用程序并希望显示日期,以便它们在用户的时区本地。我们将用户的时区设置存储在数据库中,所有日期都以UTC格式存储在数据库中,这应该很简单。诀窍是我还需要显示为用户本地化的每个日期的时区偏移量。时区偏移量应该是服务器的偏移量,而是用户的偏移量。

String timezone = (String)sessionCookie["time_zone"];
TimeZoneInfo localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timezone);
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDt, localTimeZone);

如果我接着尝试:

localDateTime.ToString("dd MMM yy - HH:mm:ss (zzz)");

我总是在zzz部分得到服务器的偏移量,而不是我刚刚转换为的偏移量。有没有办法使用这个格式字符串,但让它显示用户的偏移量...我知道我可以通过执行以下操作手动获取此偏移量:

localTimeZone.GetUtcOffset(localDateTime);

我知道手动格式化仍然非常简单我只是想知道是否有办法根据特定时区而不是系统时区格式化DateTime对象而不重新发明轮子。主要原因是我有用于将日期从utc转换到本地时区的实用功能,并且该功能完成了获取用户时区的工作以及什么不是,现在我需要复制该工作的日期以确定UtcOffset是什么是..我想我能做的另一件事是让我的函数返回DateTime和UtcOffset作为元组,所以我不必复制工作..从未在C#中使用过元组,并且不确定我们的应用程序是否支持。如果我可以简单地将toString函数定位到特定时区,那么仍然会很好。

2 个答案:

答案 0 :(得分:3)

尝试使用DateTimeOffset

DateTimeOffset utcDto = new DateTimeOffset(utcDt, TimeSpan.Zero);
DateTimeOffset localDateTime = TimeZoneInfo.ConvertTime(utcDto, localTimeZone);
string dateString = localDateTime.ToString("dd MMM yy - HH:mm:ss (zzz)");

答案 1 :(得分:0)

     String timezone = (String)sessionCookie["time_zone"];
     DateTime dt = TimeZoneInfo.ConvertTimeFromUtc(utcDt, localTimeZone );
     TimeSpan span = localTimeZone.GetUtcOffset(utcDt)
          .Subtract(TimeZoneInfo.Local.GetUtcOffset(utcDt));
     DateTimeOffset tzOffset = new DateTimeOffset(dt, span);
     string dateString = tzOffset.ToString("dd MMM yy - HH:mm:ss (zzz)");