Ada*_*ter 149

通过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);
Run Code Online (Sandbox Code Playgroud)


pig*_*ina 115

那这个呢?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是这个问题的最佳答案. (4认同)

Mat*_*hen 17

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

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)

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

Timestamp ts = new Timestamp(millis);
Run Code Online (Sandbox Code Playgroud)

  • 错了,不会编译!编译错误:09是八进制数,但是9超出了八进制的范围.逻辑错误:月份为0,您将于2007年10月23日到达 (2认同)

Bas*_*que 10

TL;博士

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

java.time

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

这些新类的灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展.他们取代了早期版本的Java捆绑的臭名昭着的旧日期时间类.

在java.time中,a Instant是UTC时间轴上的一个时刻.A ZonedDateTime是瞬间调整为时区(ZoneId).

时区在这里至关重要.如果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.asStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Run Code Online (Sandbox Code Playgroud)

跑步时

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.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,和更多.

  • 我不知道如何获得OP或Mod来将您的答案标记为正确答案。公认的答案太过时了。 (2认同)

Ale*_*lex 5

您还可以执行以下操作:

// 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());
Run Code Online (Sandbox Code Playgroud)

  • 错误:尝试结果的System.out.println!您将得到类似:“ 2009-10-23 15:26:56.171”月份是从0开始的,所以9是10月! (2认同)