4

我在 GMT 时区的 Xamarin Studio (v4.0.12 - Mono 3.2.3) 中运行以下代码...

var utcDateTime = new DateTime(1970, 07, 15, 15, 00, 00, DateTimeKind.Utc);
string utcTimeString = utcDateTime.ToLongTimeString();
string localTimeString = utcDateTime.ToLocalTime().ToLongTimeString();

...但两个变量都返回值“3:00:00 PM”。

如果我在 .NET 4.0 下运行相同的代码,那么第二个变量是“4:00:00 PM”。这是我所期望的。

我不确定我错过了什么,这两者不应该相同吗?

从“ToLocalTime()”返回的 DateTime 看起来与原来的相同,只是“Kind”现在是“Local”。

更新:

这肯定与上述示例中的年份有关。如果输入当前年份,则时间不同(且正确),如果输入 1970 年之前的任何内容,则忽略时区。

这是我的时区信息的副本,基于http://msdn.microsoft.com/en-us/library/system.timezone.currenttimezone.aspx中的代码

Standard time name:           GMT
Daylight saving time name:    BST

Current date and time:        2013-10-02 09:27
Daylight saving time?         True
Coordinated Universal Time:   2013-10-02 08:27
UTC offset:                   01:00:00

Daylight saving time for year 1970:
0001-01-01 00:00 to 0001-01-01 00:00, delta: 00:00:00

1970
7/15/1970 3:00:00 PM
7/15/1970 3:00:00 PM

2005
7/15/2005 3:00:00 PM
7/15/2005 4:00:00 PM

Now
10/2/2013 8:27:09 AM
10/2/2013 9:27:09 AM
4

4 回答 4

2

通过查看DateTimeMono 的源代码,我们可以看到ToLocalTime调用用于TimeZone.CurrentTimeZone执行转换,

https://github.com/mono/mono/blob/master/mcs/class/corlib/System/DateTime.cs

因此,要解决您遇到的这个问题,您可能会TimeZone.CurrentTimeZone在两种情况下(iOS 和 Windows)都打印出来,看看是否有任何显着差异。

Windows 的情况是正确的,因为 .NET 4 访问底层 Windows 系统以定位正确的时区(完全支持 DST)。

Xamarin.iOS 案例很困难,因为我们不确定 iOS 是否公开了正确的时区信息以及 Xamarin.iOS 是否正确使用它。

于 2013-10-02T02:27:02.753 回答
1

试试这个解决方法扩展方法

public static class DateTimeExtensions
{
    public static DateTime ToLocalTimeX(this DateTime dateTime)
    {
        var info = TimeZoneInfo.Local;
        return dateTime.Add(info.BaseUtcOffset.Add(TimeSpan.FromHours(info.IsDaylightSavingTime(DateTime.Now) ? 1 : 0)));
    }
}
于 2014-09-26T13:21:50.060 回答
0

虽然正在针对此错误进行修复,但您可以将此解决方法用于 DateTime.ToLocalTime():

日期时间 localdate = TimeZoneInfo.ConvertTime (utcdate, TimeZoneInfo.Utc, TimeZoneInfo.Local);

于 2013-10-28T15:10:39.317 回答
0

看来你到了暑假了。

GMT 与 UTC 几乎相同(GMT 是基于太阳的,而 UTC 是基于原子钟的),但由于两者都没有夏令时,因此它们在所有意图和目的上都应该相同。

问题可能是您没有在 Windows 机器上使用 GMT,而是使用其他一些可感知夏令时的时区。

于 2013-10-01T21:13:19.570 回答