[英]Are adding weeks, months or years to a date/time independent from time zone?
我的软件使用本地时间显示日期/时间,然后以UTC格式将其发送到服务器。 在服务器端,我想在这个日期/时间添加月,年,周,日等。 但是,问题是,如果我使用UTC日期/时间的这种方法,然后将其转换回本地时间,结果是否总是相同的,就好像我直接使用本地时间的方法一样?
这是C#中的一个例子:
// #1
var utc = DateTime.Now.ToUtcTime();
utc = utc.AddWeeks(2); // or AddDays, AddYears, AddMonths...
var localtime = utc.ToLocalTime();
// #2
var localtime = DateTime.Now;
localtime = localtime.AddWeeks(2); // or AddDays, AddYears, AddMonths...
#1和#2的结果总是一样吗? 或时区可以影响结果?
答案可能会让你大吃一惊,但它是NO。 如果没有影响结果的时区,则无法添加天,周,月或年。
原因是并非所有当地时间都有24小时。 根据时区,该区域的规则以及DST是否在相关时段内过渡,某些“天”可能有23,23.5,24,24.5或25小时。 (如果您想要精确,那么请使用术语“标准日”来表示您的确切意味着24小时。)
例如,首先将计算机设置为美国为夏令时更改的时区之一,例如太平洋时间或东部时间。 然后运行以下示例:
这个涵盖2013年“春季前进”的转型:
DateTime local1 = new DateTime(2013, 3, 10, 0, 0, 0, DateTimeKind.Local);
DateTime local2 = local1.AddDays(1);
DateTime utc1 = local1.ToUniversalTime();
DateTime utc2 = utc1.AddDays(1);
DateTime local3 = utc2.ToLocalTime();
Debug.WriteLine(local2); // 3/11/2013 12:00:00 AM
Debug.WriteLine(local3); // 3/11/2013 1:00:00 AM
这一次涵盖了2013年“后备”转型:
DateTime local1 = new DateTime(2013, 11, 3, 0, 0, 0, DateTimeKind.Local);
DateTime local2 = local1.AddDays(1);
DateTime utc1 = local1.ToUniversalTime();
DateTime utc2 = utc1.AddDays(1);
DateTime local3 = utc2.ToLocalTime();
Debug.WriteLine(local2); // 11/4/2013 12:00:00 AM
Debug.WriteLine(local3); // 11/3/2013 11:00:00 PM
正如您在两个示例中所看到的 - 结果是一个小时,一个方向或另一个方向。
其他几点:
AddWeeks
方法。 乘以7并添加天数。 ToUtcTime
方法。 我认为你在寻找ToUniversalTime
。 DateTime.Now.ToUniversalTime()
。 这在内部是多余的.Now
它必须花费UTC时间并转换为本地时间。 而是使用DateTime.UtcNow
。 .Now
或.ToLocalTime
或曾经一起工作DateTime
具有Local
种。 如果这样做,那么您将介绍服务器的时区 - 而不是用户的时区。 如果您的用户不在同一时区,或者您曾在其他地方部署过您的应用程序,那么您将遇到问题。 以下是你应该做的事情:
// on the client
DateTime local = new DateTime(2013, 3, 10, 0, 0, 0, DateTimeKind.Local);
DateTime utc = local.ToUniversalTime();
string zoneId = TimeZoneInfo.Local.Id;
// send both utc time and zone to the server
// ...
// on the server
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
DateTime theirTime = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);
DateTime newDate = theirTime.AddDays(1);
Debug.WriteLine(newDate); // 3/11/2013 12:00:00 AM
只是为了好的衡量,如果您使用Noda Time代替它,它的外观如下:
// on the client
LocalDateTime local = new LocalDateTime(2013, 3, 10, 0, 0, 0);
DateTimeZone zone = DateTimeZoneProviders.Tzdb.GetSystemDefault();
ZonedDateTime zdt = local.InZoneStrictly(zone);
// send zdt to server
// ...
// on the server
LocalDateTime newDate = zdt.LocalDateTime.PlusDays(1);
Debug.WriteLine(newDate); // 3/11/2013 12:00:00 AM
#1和#2的结果总是一样吗?
我的钱是YES 。 我没有看到他们为什么不一样的原因。
本地时间等于协调世界时(UTC)时间加上 UTC偏移。
转换返回的值是DateTime,其Kind属性始终返回Local。 因此,即使将ToLocalTime 重复应用于同一DateTime,也会返回有效结果。
协调世界时(UTC)等于本地时间减去 UTC偏移。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.