C# DateTime in Java

本文关键字:Java in DateTime | 更新日期: 2023-09-27 18:14:33

我正在尝试将毫秒转换为Java中的时间。

当我在c#中这样做时

DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
Console.WriteLine("1406205185123 = " + EpochOrigin.AddMilliseconds(1406205185123));

result 24/07/2014 12:33:05

当我在Java中做同样的事情

 Calendar cc = new GregorianCalendar();
cc.setTimeInMillis(1406205185123L);

result thjul 24 13:33:05 BST 2014

Java结果比c#多增加1小时。

有什么建议我怎么解决这个问题吗?

C# DateTime in Java

在c#中,DateTime不存储时区信息,但有一个Kind属性,其值指示该实例表示的时间是基于本地时间、协调世界时(UTC)还是两者都不是(参见MSDN)。"DateTime.Kind"属性的默认值为"Unspecified"。因此,在你的c#代码中,创建了一个DateTime结构体

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);

应该这样创建:

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

,以便用作转换的参考时间(Epoch时间原点为1970年1月1日00:00 UTC)。

更多信息可以在前面的问题中找到:https://stackoverflow.com/a/2883645/1236452。

编辑1

快速注释:c# 中的DateTime在某种程度上知道时区(我的本地时间是GMT+1)(edit:请参阅注释和edit 2):

DateTime t = new DateTime(1970,1,1,0,0,0);
Console.WriteLine(t.ToLocalTime());      // 01/01/1970 01:00:00 (GMT+1)
Console.WriteLine(t.ToUniversalTime());  // 31/12/1969 23:00:00 (GMT)

编辑2

正如在注释中正确指出的那样,DateTime不知道时区,因为它保存了时区信息。但是,在它的Kind属性中确实存储了一个值,该值指示实例是基于本地时间还是UTC时间,如文档中所述:

DateTime。Kind属性:获取一个值,该值指示此实例表示的时间是基于本地时间、协调世界时(UTC)还是两者都不是。[…]

Kind属性允许DateTime值清楚地反映协调世界时(UTC)或本地时间。相反,DateTimeOffset结构可以明确地将任何时区中的任何时间反映为单个时间点。

如您所见,Java中的结果有BST标记,表明它是在英国夏令时。所以GregorianCalendar会考虑你的时区。

c#中的

DateTime不知道时区,所以它是UTC,因为unix epoch是UTC,如果你在UTC时间上添加毫秒,你也会得到UTC时间。

感谢您的回复和解答。我知道为什么了:

c#和Java都知道时区。

因为c#做了这个

DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
EpochOrigin.AddMilliseconds(1406205185123)
Java中的

应该是

Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
long result = cal.getTimeInMillis();
long value = result + 1406205185123;
return new Timestamp(value);