Java:将String转换为TimeStamp
Java:将String转换为TimeStamp
在我试图将一个 String
转换成 TimeStamp
时,出现了问题。我有一个包含日期格式为 yyyy-MM-dd
的数组,我想要将其转换为 yyyy-MM-dd HH:mm:ss.SSS
格式。所以,我使用了这段代码:
final String OLD_FORMAT = "yyyy-MM-dd"; final String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; String oldDateString = createdArray[k]; String newDateString; final DateFormat formatter = new SimpleDateFormat(OLD_FORMAT); final Date d = formatter.parse(oldDateString); ((SimpleDateFormat) formatter).applyPattern(NEW_FORMAT); newDateString = formatter.format(d); System.out.println(newDateString); final Timestamp ts = Timestamp.valueOf(newDateString); System.out.println(ts);
然后我得到了如下结果:
2009-10-20 00:00:00.000
2009-10-20 00:00:00.0
但当我尝试简单地执行以下代码时:
final String text = "2011-10-02 18:48:05.123"; ts = Timestamp.valueOf(text); System.out.println(ts);
我得到了正确的结果:
2011-10-02 18:48:05.123
你知道我可能哪里做错了吗?
谢谢帮助。
Java: 将字符串转换为时间戳
问题出现的原因:
在2013年提出这个问题时,使用Timestamp类是正确的,例如将日期时间存储到数据库中。但是,这个类现在已经过时了。现代的Java日期和时间API于2014年春季随Java 8一起发布,已经有三年半的历史了。我建议您使用它来代替。
解决方法:
根据您的情况和具体要求,有两个自然的替代方案可以替代Timestamp类:
- Instant类是时间线上的一个点。对于大多数情况,我认为使用它是最安全的。Instant类与时区无关,在客户端设备和数据库服务器运行不同时区的情况下通常也能正常工作。
- LocalDateTime类是没有时区的日期和时间,例如2011-10-02 18:48:05.123(引用问题中的内容)。
现代的JDBC驱动程序(JDBC 4.2或更高版本)以及其他现代的数据库访问工具都可以将Instant或LocalDateTime存储到数据库的timestamp数据类型列中。本文中使用的这两个类和其他日期时间类属于现代API,即java.time或JSR-310。
首先,将字符串转换为LocalDateTime是最简单的,下面是具体代码:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS"); String text = "2011-10-02 18:48:05.123"; LocalDateTime dateTime = LocalDateTime.parse(text, formatter); System.out.println(dateTime);
这将打印出:
2011-10-02T18:48:05.123
如果您的字符串是yyyy-MM-dd格式,请使用以下代码:
String text = "2009-10-20"; LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay(); System.out.println(dateTime);
这将打印出:
2009-10-20T00:00
或者更好的做法是将LocalDate.parse()的输出存储到一个数据类型为date的数据库列中。
无论哪种情况,从LocalDateTime转换为Instant的步骤如下:
Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant(); System.out.println(ts);
我指定了使用JVM的默认时区进行转换,因为这是过时的Timestamp类将使用的方式。但是,这种方式是脆弱的,因为时区设置可能会在程序的其他部分或同一JVM中运行的其他程序的影响下发生变化。如果可能的话,最好使用“区域/城市”格式指定时区,例如:
Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();
之前给出的答案是基于提问者的问题。并不是说这样的回答是对还是错。
您是完全正确的。因为问题和答案会被保留下来供后人参考,所以问题是我们是让2013年的答案独立存在,还是补充一个能够展示未来最佳解决方案的答案。
问题:如何将字符串转换为时间戳(TimeStamp)?
原因:在Java中,将字符串转换为时间戳时可能会出现异常。这可能是因为使用了错误的日期格式或解析过程中出现了错误。
解决方法:遵循以下步骤以获得正确的结果:
try { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS"); Date parsedDate = dateFormat.parse(yourString); Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime()); } catch(Exception e) { // 处理异常 }
需要注意的是,.parse(String)
方法可能会抛出ParseException
异常。
此外,需要注意日期模式中的hh
可能导致问题,因为它会将小时解释为“上午/下午的小时(1-12)”。应该使用HH
来获取“一天中的小时(0-23)”,以解决问题。
Java中将字符串转换为TimeStamp的原因是因为需要在程序中处理日期和时间数据,而字符串是一种常见的日期和时间数据的表示形式。解决方法是使用DateFormat和SimpleDateFormat类来解析和格式化日期字符串,并使用Timestamp类来表示日期和时间。
在给定的代码中,convertStringToTimestamp方法接受一个字符串参数strDate,该字符串表示日期。代码的目标是将这个字符串转换为TimeStamp对象。
为了实现这一目标,代码首先创建一个DateFormat对象formatter,并使用指定的日期格式"dd/MM/yyyy"进行初始化。然后,代码使用formatter.parse方法将字符串解析为Date对象date。接下来,代码创建一个Timestamp对象timeStampDate,并使用date.getTime方法获取时间戳,并将其传递给Timestamp的构造函数。最后,方法返回这个Timestamp对象。
然而,在实际使用中可能会遇到问题。上述代码的作者提到,他遇到了错误,因为他错误地导入了java.sql.Date类,而不是java.util.Date类。因此,正确的解决方法是导入java.util.Date类。
通过使用正确的类导入和正确的日期格式,可以确保将字符串正确地转换为TimeStamp对象,从而在Java程序中方便地处理日期和时间数据。