public static void main(String[] args) {
Timestamp ts = new Timestamp(116, 02, 12, 20, 45, 0, 0);
Date d = new Date();
d.setTime(ts.getTime());
System.out.println(d);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
//System.out.println(ts.getTime());
System.out.println(simpleDateFormat.format(ts));
System.out.println(Timestamp.valueOf(simpleDateFormat.format(ts)));
}
在上面的代码中,最后两行打印不同的值。当前时区是CST,我想将其转换为UTC。当我将其转换时,最后两行在一小时内打印不同的值,即最后一次打印3月13日凌晨2:45,最后一次打印3月13日凌晨3:45。他们为何与众不同,我该如何纠正。
Instant inst = LocalDateTime.of(2016, Month.MARCH, 12, 20, 45)
.atZone(ZoneId.of("America/Chicago"))
.toInstant();
System.out.println(inst);
此打印
2016-03-13T02:45:00Z
今天,您(通常)不需要一个Timestamp
对象。该java.sql.Timestamp
班是早已过时。一旦我们将其用于与SQL数据库之间以纳秒精度传输时间戳值。今天,我们Instant
改为使用该类。Instant
是java.time
现代Java日期和时间API
的类之一(有时我们使用LocalDateTime
相同的API,这取决于您的确切要求和数据库列的数据类型)。
a
Timestamp
和an中都没Instant
有时区。不同于Timestamp
所述Instant
在UTC总是打印(由表示Z
在上述输出的结束)。如您所见,以上代码段已将您的CST时间20:45
CST正确转换为第二天UTC。
如果确实需要时间戳,通常是对于您无法更改或现在不想更改的旧版API,则转换很容易:
Timestamp ts = Timestamp.from(inst);
System.out.println(ts);
2016-03-12 20:45:00.0
Timestamp.toString
使用JVM的时区设置来生成字符串,因此您可以识别出我们开始的时间。因此,Timestamp
其中包含正确的时间点。无需以任何方式进行转换。如果错误地将其插入数据库,则问题出在JDBC驱动程序,数据库或其他地方,如果可以的话,您应该更正此错误。
如果将ThreeTen Backport添加到项目中,则与上述代码非常相似的代码将在Java 7中运行。这是这些java.time
类向Java
6和7的反向移植,并且在底部包括一个链接(它是JSR-310的ThreeTen,是最早描述现代API的地方)。
Instant inst = LocalDateTime.of(2016, Month.MARCH, 12, 20, 45)
.atZone(ZoneId.of("America/Chicago"))
.toInstant();
Timestamp ts = DateTimeUtils.toSqlTimestamp(inst);
您会注意到从Java 8唯一的区别是我们转换的方式Instant
到Timestamp
。结果当然是一样的。
如果您不希望依赖ThreeTen
Backport,当然还有一些方法可以获取Timestamp
。我不会像代码中那样使用不推荐使用的构造函数,即使只要没有人篡改JVM的时区设置,它就可以工作。如果您知道要Timestamp
等于02:45
UTC,则一种选择是
Timestamp ts = Timestamp.valueOf("2016-03-12 20:45:00");
但是,它仍然取决于JVM的时区设置。
如前所述,其中Timestamp
没有时区,因此将a转换Timestamp
为UTC没有任何意义。
您的代码中会发生什么:
Timestamp
建议使用的构造函数使用您的JVM的时区设置(美国/芝加哥,我认为)Timestamp
在您的时区(与3月13日UTC时间3月13日相同的时间点)的相应时间2016年3月12日构造相应的时间。SimpleDateFormat
正确格式化为2016-03-13 02:45:00
(UTC)。Timestamp.valueOf()
也使用美国/芝加哥时区。但是,在3月12日至13日之间的夜晚,夏季时间(夏令时)在该时区开始。凌晨2时,时钟向前移动到3.因此,有 是 没有2:45这个夜晚。Timestamp
选择3:45代替。例如,我如何做到这一点? 和 像这样的东西,我试着在网上搜索,但我找不到任何关于这方面的教程,所以我在这里问。
只是想知道为什么 调用world\u开关: 结果没有任何变化,我想增加或减少实例变量@pos\u X或@pos\u Y 这是我的初始化方法 这就是我如何创建类的实例 我们将不胜感激
本文向大家介绍iOS hitTest方法&pointInside方法相关面试题,主要包含被问及iOS hitTest方法&pointInside方法时的应答技巧和注意事项,需要的朋友参考一下 hitTest方法 当事件传递给控件的时候,就会调用控件的这个方法,去寻找最合适的view point:当前的触摸点,point这个点的坐标系就是方法调用者 pointInside方法 作用:判断当前这个
书籍与公开课 我喜欢看一些有关基础原理的书,如操作系统、计算机网络等。但是最近在看《计算机网络:自顶向下方法》的时候发现,这些书都太大而全了,让人看着很吃力,而且抓不住重点。 知名大学都有公开课,视频比枯燥的书要更好,也讲的更有侧重点。我觉得以后可以跟着公开课来看书: 如果不知道某个科目要看什么书,可以跟着公开课学习,看参考教材 如果已经确定要读某本经典书,可以先找有没有公开课 这些公开课可以在知
主要内容:Python类实例方法,Python类方法,Python类静态方法和类属性一样,类方法也可以进行更细致的划分,具体可分为 类方法、 实例方法和 静态方法。 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。 其中 @classmethod 和 @staticmethod 都是函数装饰器,后续章节会对其做详
Methods 方法 Pointers vs. Values 指针 vs. 值 As we saw with ByteSize, methods can be defined for any named type (except a pointer or an interface); the receiver does not have to be a struct. 正如 ByteSize 那样