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()
。