Java中的C#日期时间
我试图用Java将毫秒转换为时间 当我在C 结果2014年7月24日12:33:05 当我在Java中执行相同操作时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
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);