代码之家  ›  专栏  ›  技术社区  ›  Matt Wolfe

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

  •  2
  • Matt Wolfe  · 技术社区  · 14 年前

    不是服务器的偏移量,而是用户的偏移量。

    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 回复  |  直到 14 年前
        1
  •  3
  •   Quartermeister    14 年前

    尝试使用 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)");
    
        2
  •  0
  •   Primary Key    14 年前
         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)");