如何获得两个时区之间的时差以及夏时制

时间:2018-11-01 16:35:10

标签: c#

我需要根据用户个人资料动态获取两个时区之间的时差。

假设我是用户A,今天我的个人资料位于MST时区(即源时区),而我的目标时区则位于PST时区,那么我需要获取MST和PST的时差。让我们假设3个小时是差异,那么我需要得到这3个小时的差异。

同时另一个用户B可能处于CST时区中,这是源时区,而目标时区中则是HST时区,那么我需要获取CST和HST的小时数之差。假设有1个小时的差异,那么我需要得到这1个小时的差异。

如果“ N”个用户没有使用该应用程序,并且他们处于夏时制,那么如果他们没有夏令时,则应基于夏时制计算时区计算应该在不考虑日光的情况下进行。

我该如何实现?我是新手,有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

这种机制对我有用了很多年。 Windows使用一个注册表项来维护本地计算机的时区信息。我记不起来版本了,但是,几年前.NET将时区信息读入TimeZoneInfo对象中,然后才必须自己编写一个包装器。下面的伪指令显示了一般用法。基本租户是:

1. Each client receives the time from the DB or other Layer as UTC. (all datetimes saved as UTC)
2. Using the client profile, convert the UTC DateTime value to the client's local value.
3. Display the date and do date math in the user's local time.
4. Before sending the time to the DB or another layer with different TZ convert back to UTC.

这应该使您的日期逻辑保持声音。

string userTimeZone = GetUsersTimeZone();
DateTime timeReadFromDBOrSomewhereInUTC = GetSomeDateTimeInUTC();


DateTime timeInUsersTimeZone = FromUTCToSpecificTimeZone(userTimeZone ,timeReadFromDBOrSomewhereInUTC );

edtTimeForAppointment.Text = timeInUsersTimeZone.ToString();

timeInUsersTimeZone.AddHours(2);

DateTime timeConvertedToUTCToSaveToDB = FromSpecificTimeZoneToUTC(userTimeZone,timeInUsersTimeZone);

这里是使用TimeZoneInfo的两个函数的示例。

public static DateTime FromSpecificTimeZoneToUTC(TimeZoneInfo fromZone, DateTime specificTimeZoneDateTime)
{
    DateTime temp = DateTime.SpecifyKind(specificTimeZoneDateTime, DateTimeKind.Unspecified);
    return TimeZoneInfo.ConvertTimeToUtc(temp, fromZone);
}

public static DateTime FromUTCToSpecificTimeZone(TimeZoneInfo toZone, System.DateTime UTCTimeZoneDateTime)
{           
    return TimeZoneInfo.ConvertTimeFromUtc(UTCTimeZoneDateTime, toZone);
}

如果您只需要在两个时区之间使用DateTime的偏移量,那么下面的功能可能会有用。

public static TimeSpan GetTimeZoneOffsetDifference(TimeZoneInfo oldZone, TimeZoneInfo newZone)
{           
    var now = DateTimeOffset.UtcNow;
    TimeSpan oldOffset = oldZone.GetUtcOffset(now);
    TimeSpan newOffset = newZone.GetUtcOffset(now);
    TimeSpan difference = oldOffset - newOffset;
    return difference;
}

答案 1 :(得分:0)

我们过去曾经使用DateTimeOffset解析的一个来处理这个问题

  • JavaScript在表单提交过程中插入用户的本地时间
  • 我们以分钟为单位保存首选时区偏移的用户个人资料

我们将偏移量存储为SMALLINT而不是替代方法,因为它很容易使用TimeSpan.FromMinutes,因此我们可以支持时区,而不仅仅是小时偏移量(例如印度是UTC + 5: 30)。

利用精确的UTC偏移量将DateTimeOffset存储在数据库中,我们能够根据需要进行报告(通过UTC或转换为首选时区)或显示符合我们要求的审核/数据表。

话虽如此,我想还有更好的许多其他方法。