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
不存储时区信息,但有一个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);