Answers:
通过Timestamp
,我相信你的意思java.sql.Timestamp
。您会注意到,该类具有一个接受long
参数的构造函数。您可以使用以下DateFormat
类进行解析:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
,java.util.Calendar
和java.text.SimpleDateFormat
现在已成为旧版)被Java 8及更高版本中内置的java.time类取代。请参见Oracle 教程。
那这个呢?
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);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
让我们通过使用Java 8和更高版本中内置的java.time框架显示代码来更新此页面。
这些新类的灵感来自由JSR 310定义的Joda-Time,并由ThreeTen-Extra项目扩展。他们取代了与早期Java版本捆绑在一起的臭名昭著的麻烦日期时间类。
在java.time中,Instant
UTC时间轴上的时刻是一个时刻。A ZonedDateTime
是调整为时区(ZoneId
)的Instant 。
时区在这里至关重要。如果September 23, 2007
不应用时区,则日期不能转换为时间轴上的某个时刻。考虑到巴黎的新天要比现在仍在“昨天”的蒙特利尔早。
另外,java.sql.Timestamp代表日期和时间。因此,我们必须注入日期中的时间。我们假设您希望将一天的第一时间作为一天中的时间。请注意,00:00:00.0
由于夏时制和其他可能的异常,这并不总是时间。
请注意,与旧的java.util.Date类不同,与Joda-Time不同,java.time类型的分辨率为纳秒而不是毫秒。这与java.sql.Timestamp的分辨率匹配。
请注意,java.sql.Timestamp有一个讨厌的习惯,即在通过其toString
方法生成字符串表示形式时,将JVM的当前默认时区隐式地应用到其日期时间值。在这里,您可以看到我的America/Los_Angeles
时区。相反,使用标准ISO 8601格式的java.time类更为合理。
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( 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 [美国/蒙特利尔] =即时:2007-09-23T04:00:00Z = ts:2007-09-22 21:00: 00.0
顺便说一句,从JDBC 4.2开始,您可以直接使用java.time类型。不需要java.sql.Timestamp
。
PreparedStatement.setObject
ResultSet.getObject
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。java.sql.*
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
您还可以执行以下操作:
// 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());
根据API,不赞成使用将接受年,月等的构造函数。相反,您应该使用接受long的构造方法。您可以使用Calendar实现来构造所需的日期,并使用long(例如,使用getTimeInMillis方法)访问时间表示。
为了完整起见,还有一个Joda-Time版本2.5及其DateTime
类的解决方案:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
对象的毫秒数(自纪元以来)。替换.toDate().getTime()
为.getMillis()
。
DateTimeZone.getDefault()
地说明。(顺便说一句,同上,对Locale.getDefault()
,在可选参数的不确定性同样的问题。)
一个更通用的答案是import java.util.Date
,然后当您需要将其设置为timestamp
当前日期时,只需将其设置为即可new Date()
。