尝试在夏令时结束前以编程方式设置PC时钟

时间:2010-05-25 07:21:25

标签: c# .net c#-2.0

重现:

1)将Microsoft.VisualBasic程序集添加到项目引用

2)将PC时区更改为:(GMT + 10:00)堪培拉,墨尔本,悉尼。确保将PC设置为自动调整夏令时的时钟。 (对于此时区,夏令时结束于2010年4月4日凌晨3点。)

3)添加以下代码:

    public void SetNewDateTime(DateTime dt)
    {
        Microsoft.VisualBasic.DateAndTime.Today = dt; // ignores time component
        Microsoft.VisualBasic.DateAndTime.TimeOfDay = dt;  // ignores date component
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = new DateTime(2010, 4, 5, 5, 0, 0);  // XX
        SetNewDateTime(dt);  // XX

        System.Threading.Thread.Sleep(500);

        DateTime dt2 = new DateTime(2010, 4, 4, 1, 0, 0);
        SetNewDateTime(dt2);
    }

4)单击按钮1时,PC时钟最终显示凌晨2点,而预计凌晨1点。 (如果删除了标记为“XX”的代码,则时钟有时会显示正确的时间为凌晨1点。

知道发生了什么事吗? (或者是否有更可靠的方法从C#代码设置PC时钟?)

TIA。

编辑

为回应David M,我尝试了一些修改后的代码:

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = new DateTime(2010, 4, 5, 5,0,0, DateTimeKind.Unspecified);
        SetNewDateTime(dt);

        System.Threading.Thread.Sleep(500);

        // type : 2010-04-04T01:00:00 into textBox1

        DateTime dt2 = System.Xml.XmlConvert.ToDateTime(textBox1.Text, System.Xml.XmlDateTimeSerializationMode.Unspecified);

        SetNewDateTime(dt2);
    }

这从textBox获取DateTime输入。结果是一样的。

1 个答案:

答案 0 :(得分:1)

我设置系统时间的方式一直使用SetSystemTime,如下例所示:

http://www.pinvoke.net/default.aspx/kernel32.setsystemtime

不确定是否能解决您的问题,但也许值得一试。