tl;博士
使用现代 java.time 类。
LocalDate.parse(
"13-09-2011" ,
DateTimeFormatter.ofPattern( "dd-MM-uuuu" )
)
.atStartOfDay(
ZoneId.of( "Africa/Casablanca" ) // Or use `ZoneOffset.UTC` instead of a zone.
)
.toInstant()
.toEpochMilli()
看到这个code run live at IdeOne.com。
1315872000000
详情
显然,您希望将特定日期的第一时刻表示为自 UTC 中 1970 年第一时刻的纪元参考以来的毫秒数。
java.time
现代方法使用 java.time 类,该类在几年前取代了麻烦的遗留类,例如 Date、Calendar 和 SimpleDateFormat。
首先将您的输入字符串解析为LocalDate,以获得没有时间和时区的仅日期值。
提示:在将日期时间值作为文本交换时,不要使用此类自定义格式,而是使用标准的ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用它们。
String input = "13-09-2011" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
确定该日期当天的第一个时刻。这样做需要一个时区。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。
如果没有指定时区,JVM 会隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将 desired/expected time zone 明确指定为参数。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 2-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
永远不要假设一天从 00:00 开始。在某些日期的某些区域中,一天可能从另一个时间开始,例如 01:00。让 java.time 确定第一时刻。
ZonedDateTime zdt = ld.startOfDay( z ) ; // Determine first moment of the day on this date in this zone. May not be 00:00.
通过提取Instant,从该区域调整为UTC。
Instant instant = zdt.toInstant() ;
获取自 1970-01-01T00:00Z 以来的毫秒数。请注意可能的数据丢失,因为Instant 具有更精细的纳秒分辨率。任何微秒或纳秒都将被忽略。
long millisecondsSinceEpoch = instant.toEpochMilli() ;
您可以返回另一个方向,从一个从纪元计数到 Instant。
Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?