我正试图在Java中将数千秒转换为时间。
当我在C#中做这件事时
DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
Console.WriteLine("1406205185123 = " + EpochOrigin.AddMilliseconds(1406205185123));结果 24/07/2014 12:33:05
当我用Java做同样的事情时,
Calendar cc = new GregorianCalendar();
cc.setTimeInMillis(1406205185123L);结果清华7月24日13:33:05北京时间2014年
Java结果比C#多增加了1个小时。
有什么建议我该怎么解决吗?
发布于 2014-07-24 16:22:15
在C#中,DateTime不存储时区信息,而是具有一个Kind属性,该属性的值指示由此实例表示的时间是基于本地时间、协调世界时间(UTC)还是基于neithee (参见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 in C#不知怎么知道时区(我的本地时间是DateTime,请参阅评论和编辑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-24 16:07:26
正如你所看到的,在Java中有BST标记,这说明它是在英国的夏季时间。因此,GregorianCalendar将您的时区考虑在内。
DateTime in C#不知道时区,所以它是UTC,因为unix时代是UTC,如果将毫秒添加到UTC时间,也会得到UTC时间。
发布于 2014-08-01 21:48:59
谢谢你的答复和回答。我知道为什么:
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);https://stackoverflow.com/questions/24938554
复制相似问题