Java的时间戳 – 我如何创builddate23/09/2007的时间戳?

如何创builddate为23/09/2007的时间戳?

按照Timestamp ,我认为你的意思是java.sql.Timestamp 。 你会注意到这个类有一个接受long参数的构造函数。 你可以使用DateFormat类来parsing它:

 DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); Date date = dateFormat.parse("23/09/2007"); long time = date.getTime(); new Timestamp(time); 

那这个呢?

 java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0"); 

你什么意思是时间戳? 如果你的意思是自Unix纪元以来的毫秒数:

 GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23); long millis = cal.getTimeInMillis(); 

如果你想要一个实际的java.sql.Timestamp对象:

 Timestamp ts = new Timestamp(millis); 

TL;博士

 java.sql.Timestamp.from ( LocalDate.of ( 2007 , 9 , 23 ) .asStartOfDay( ZoneId.of ( "America/Montreal" ) ) .toInstant() ) 

java.time

让我们通过使用Java 8及更高版本中内置的java.time框架显示代码来更新此页面。

这些新课程受JSR 310定义的Joda-Time的启发,并由ThreeTen-Extra项目扩展。 它们取代了与早期版本的Java捆绑的臭名昭着的旧date时间类。

在java.time中, Instant是UTC中时间轴上的一个时刻。 ZonedDateTime是一个即时调整到时区( ZoneId )。

时区在这里至关重要。 September 23, 2007日的date不能在时间轴上转换,而不应用时区。 考虑一下,巴黎之前的一个新的一天比在蒙特利尔还是“昨天”的时候早。

另外,java.sql.Timestamp表示date和时间。 所以我们必须注入date以符合date。 我们假设你想要一天当中的第一个时刻。 请注意,由于夏令时和其他可能的exception情况,并不总是00:00:00.0

请注意,与旧的java.util.Date类不同,与Joda-Time不同,java.timetypes的分辨率为毫微秒,而不是毫秒。 这匹配java.sql.Timestamp的分辨率。

请注意,当通过toString方法生成string表示forms时,java.sql.Timestamp具有将JVM的当前默认时区隐式应用于其date时间值的恶习。 在这里你可以看到我应用的America/Los_Angeles时区。 相比之下,使用标准的ISO 8601格式的java.time类更加健全。

 LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ; ZoneId z = ZoneId.of ( "America/Montreal" ) ; ZonedDateTime zdt = d.asStartOfDay( z ) ; Instant instant = zdt.toInstant() ; java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ; 

转储到控制台。

 System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts ); 

运行时。

d:2007-09-23 = zdt:2007-09-23T00:00-04:00 [America / Montreal] = instant:2007-09-23T04:00:00Z = ts:2007-09-22 21:00: 00.0

顺便说一句,从JDBC 4.2开始,可以直接使用java.timetypes。 不需要java.sql.Timestamp

  • PreparedStatement.setObject
  • ResultSet.getObject

根据API ,将接受年,月等的构造函数已被弃用。 相反,你应该使用接受一个长的构造函数。 您可以使用Calendar实现来构build所需的date,并以long的forms访问时间表示,例如getTimeInMillis方法。

您也可以执行以下操作:

 // untested Calendar cal = GregorianCalendar.getInstance(); cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant... cal.set(Calendar.MONTH, 8);// -1 as month is zero-based cal.set(Calendar.YEAR, 2009); Timestamp tstamp = new Timestamp(cal.getTimeInMillis()); 

为了完整起见, Joda-Time版本2.5及其DateTime类也是一个解决scheme:

 new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis()) 

更一般的答案是导入java.util.Date ,然后当你需要设置一个等于当前date的timestamp ,简单地将它设置为等于new Date()