Java中的C#日期时间

Java中的C#日期时间,java,c#,timestamp-with-timezone,Java,C#,Timestamp With Timezone,我试图用Java将毫秒转换为时间 当我在C 结果2014年7月24日12:33:05 当我在Java中执行相同操作时 Calendar cc = new GregorianCalendar(); cc.setTimeInMillis(1406205185123L); 结果2014年7月24日星期四13:33:05英国夏令时 Java结果比C多增加1小时 有什么建议可以解决这个问题吗?正如您所看到的,Java中的结果有BST标记,它告诉您现在是英国夏季。所以GregorianCalendar

我试图用Java将毫秒转换为时间

当我在C

结果2014年7月24日12:33:05

当我在Java中执行相同操作时

 Calendar cc = new GregorianCalendar();

cc.setTimeInMillis(1406205185123L);
结果2014年7月24日星期四13:33:05英国夏令时

Java结果比C多增加1小时


有什么建议可以解决这个问题吗?

正如您所看到的,Java中的结果有BST标记,它告诉您现在是英国夏季。所以GregorianCalendar会考虑你的时区


C#中的DateTime不知道时区,所以它是UTC,因为unix历元是UTC,如果在UTC时间上加上毫秒,您也会得到UTC时间。

正如您在Java中看到的结果,它有BST标记,表示它是在英国夏季。所以GregorianCalendar会考虑你的时区

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

C#
中的DateTime
不存储时区信息,但是有一个
Kind
属性,其值指示此实例所表示的时间是基于本地时间、协调世界时(UTC)还是非本地时间(请参阅)。
DateTime.Kind
属性的默认值为
Unspecified
。因此,在C#code中,使用该行创建的
DateTime
结构

必须以这种方式创建:

以用作转换的参考时间(历元时间原点为1970年1月1日00:00UTC

更多信息可以在前面的问题中找到:

编辑1 一句简短的评论:
DateTime
在C#中不知怎么知道时区(我的本地时间是GMT+1)(edit:请参考评论和编辑2):

编辑2 正如评论中正确指出的,
DateTime
不知道时区,因为它保存了时区信息。但是,在其
Kind
属性中,它确实存储了一个值,该值指示实例是基于本地时间还是基于UTC,如中所述:

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

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

在C#
中,DateTime
不存储时区信息,但具有
种类
属性,其值指示此实例表示的时间是基于本地时间、协调世界时(UTC)还是非本地时间(请参阅)。
DateTime.Kind
属性的默认值为
Unspecified
。因此,在C#code中,使用该行创建的
DateTime
结构

必须以这种方式创建:

以用作转换的参考时间(历元时间原点为1970年1月1日00:00UTC

更多信息可以在前面的问题中找到:

编辑1 一句简短的评论:
DateTime
在C#中不知怎么知道时区(我的本地时间是GMT+1)(edit:请参考评论和编辑2):

编辑2 正如评论中正确指出的,
DateTime
不知道时区,因为它保存了时区信息。但是,在其
Kind
属性中,它确实存储了一个值,该值指示实例是基于本地时间还是基于UTC,如中所述:

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

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


谢谢你的回复和回答。我会找出原因:

C#和Java都知道时区

因为是c#干的

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

谢谢你的回复和回答。我会找出原因:

C#和Java都知道时区

因为是c#干的

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

这是一个时区问题,正如您所看到的,Java为您提供了BST时间,即英国时间,即UTC+1。C#给出UTC时区的结果。@OlivierH这应该是你的答案。@OlivierH谢谢你的回答。C#也没有告诉我们UTC时间。原因是我需要执行此Calendar cal=Calendar.getInstance();校准集(1970,0,1,0,0,0);校准设置(日历毫秒,0);这是一个时区问题,正如您所看到的,Java为您提供了BST时间,即英国时间,即UTC+1。C#给出UTC时区的结果。@OlivierH这应该是你的答案。@OlivierH谢谢你的回答。C#也没有告诉我们UTC时间。原因是我需要执行此Calendar cal=Calendar.getInstance();校准集(1970,0,1,0,0,0);校准设置(日历毫秒,0)<代码>C#中的日期时间不知何故知道时区(我的本地时间是GMT+1):如果未指定种类,您就错了日期时间不知道。是
ToUniversalTime()
方法知道时区。当你调用它时,你会发现如果你将历元转换为世界时,它会减去一个小时。@Mateusz对我的话有误导性表示歉意,但我说它
DateTime
不知怎的知道时区。具体地说,
ToUniversalTime()
方法利用了
DateTime
对象的
Kind
属性,如中所述:
从.NET Framework 2.0版开始,ToUniversalTime方法返回的值
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
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)
DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
EpochOrigin.AddMilliseconds(1406205185123)
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);