2

I am trying to convert millseconds to time in Java.

when I do this in 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

when I do same in Java

 Calendar cc = new GregorianCalendar();

cc.setTimeInMillis(1406205185123L);

result Thu Jul 24 13:33:05 BST 2014

The Java result add 1 more hour than C# .

Any suggestion how can I fix this?

4

3 回答 3

2

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

C# 中的 DateTime 不知道时区,所以它是 UTC,因为 unix 纪元是 UTC,如果你将毫秒添加到 UTC 时间,你也会得到 UTC 时间。

于 2014-07-24T16:07:26.107 回答
2

在 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);

为了用作转换的参考时间(纪元时间原点是 1970 年 1 月 1 日,00:00 UTC)。

更多信息可以在上一个问题中找到:https ://stackoverflow.com/a/2883645/1236452 。

编辑 1

一个简短的评论:DateTime在 C#不知何故知道时区(我的当地时间是 GMT+1)(编辑:请参阅评论和编辑 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 结构可以明确地将任何时区中的任何时间反映为单个时间点。

于 2014-07-24T16:22:15.280 回答
0

感谢您的回复和回答。我找出原因:

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);
于 2014-08-01T21:48:59.870 回答