我有一些过时的代码,试图解释夏时制引起的时间变化,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 31; i++)
{
DateTime dt = new DateTime(1960, 3, i, 0, 0, 0);
Console.WriteLine(dt.ToUniversalTime());
}
Console.WriteLine();
for (int i = 1; i <= 30; i++)
{
DateTime dt = new DateTime(1960, 4, i, 0, 0, 0);
Console.WriteLine(dt.ToUniversalTime());
}
Console.ReadKey();
}
}
}
这段代码遍历1960年3月和4月的日子,并打印DateTime。然而,这并不能正确地解释1960年的时间变化,我认为是因为当时时间变化的日期不同。我试图使用TimeZoneInfo类解决这个问题。我将代码更改为:
class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 31; i++)
{
DateTime dt = new DateTime(1960, 3, i, 0, 0, 0);
var tz = TimeZoneInfo.Local;
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
//use timeZoneInfo class to account for dlst offset
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
}
Console.WriteLine();
for (int i = 1; i <= 30; i++)
{
DateTime dt = new DateTime(1960, 4, i, 0, 0, 0);
var tz = TimeZoneInfo.Local;
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
//use timeZoneInfo class to account for dlst offset
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
}
Console.ReadKey();
}
}
这表明夏令时是在4月3日下午4点改变的,而它应该在4月24日凌晨2点切换,我错过了什么来正确地解释夏令时?
编辑:我当前的时区是东部。
看起来Windows时区信息与我通过TZDB所期望的不匹配。下面是一个使用野田时间的程序,它用BCL TimeZoneInfo(包装)和TZDB2012i数据显示了1960年到1965年之间的所有转换:
using System;
using NodaTime;
class Test
{
static void Main()
{
var bcl = DateTimeZoneProviders.Bcl["Eastern Standard Time"];
var tzdb = DateTimeZoneProviders.Tzdb["America/New_York"];
ShowTransitions(bcl);
ShowTransitions(tzdb);
}
static void ShowTransitions(DateTimeZone zone)
{
Console.WriteLine("Transitions for {0}", zone.Id);
Instant start = Instant.FromUtc(1960, 1, 1, 0, 0);
Instant end = Instant.FromUtc(1965, 1, 1, 0, 0);
var interval = zone.GetZoneInterval(start);
while (interval.Start < end)
{
Console.WriteLine(interval.Start);
interval = zone.GetZoneInterval(interval.End);
}
Console.WriteLine();
}
}
产出:
Transitions for Eastern Standard Time
1959-10-25T06:00:00Z
1960-04-03T07:00:00Z
1960-10-30T06:00:00Z
1961-04-02T07:00:00Z
1961-10-29T06:00:00Z
1962-04-01T07:00:00Z
1962-10-28T06:00:00Z
1963-04-07T07:00:00Z
1963-10-27T06:00:00Z
1964-04-05T07:00:00Z
1964-10-25T06:00:00Z
Transitions for America/Toronto
1959-10-25T06:00:00Z
1960-04-24T07:00:00Z
1960-10-30T06:00:00Z
1961-04-30T07:00:00Z
1961-10-29T06:00:00Z
1962-04-29T07:00:00Z
1962-10-28T06:00:00Z
1963-04-28T07:00:00Z
1963-10-27T06:00:00Z
1964-04-26T07:00:00Z
1964-10-25T06:00:00Z
还有其他时区ID映射到“东部标准时间”,但我没有找到任何匹配Windows行为的时区ID。
在美国,有诸如和这样的时区,在夏时制期间,它们是和,而当夏时制不生效时,它们是和。 那么,既然夏令时从3月的第二个星期日开始,到11月的第一个星期日结束,那么说3月到11月之间的日期是在还是是无效的吗?例如,以下日期在技术上是否不存在? 它不应该是,还是仅仅是,以避免必须指定或?
问题内容: 中欧夏令时开始于三月的最后一个星期日。我们将时钟设置为02:00到03:00。如果我在数据库请求中进行时间戳计算会发生什么?比方说,在01:59? 结果是03:00还是02:00? 如果我们将时钟设置为03:00到02:00,那结束了呢? 时间从03:00更改为02:00之后…在02:00会发生什么?是02:59还是01:59? 应该如何处理?最佳实践以及Oracle Database
夏令时间 选择[标准]或[夏令时间]。
这不起作用: 相反,发生的情况是条件始终等于 1,尽管某些时间戳在白天的保存时间内。 我正在尝试使python调用与基于c的调用的行为相匹配。
我有一个使用jquery FullCalendar构建的日历应用程序。用户查看他们本地时区中的事件,我的服务器将它们存储为MySQL中的UTC日期时间。(关于stackoverflow的其他问题表明,这是处理时区的最佳方法。)因此,每次用户在日历上保存或查看事件时都会进行转换。这很好,但我对如何最好地处理夏令时感到困惑。 例如,假设timezone EST(东部标准时间)中的一个用户在不是夏时制的
问题内容: 我必须在我的Java应用程序中打印EST时间。我使用以下方法将时区设置为EST: 但是,当在该时区遵循夏令时时,我的代码将无法打印正确的时间(它可以少打印1小时)。 不管是否遵守夏令时,如何使代码始终读取正确的时间? PS:我尝试将时区设置为EDT,但不能解决问题。 问题答案: 这是开始的问题: 应该完全避免使用3个字母的缩写,而应使用TZDB区域ID。EST是东部标准时间- 标准时间