使用 java 8 和格式将字符串转换为日期 -> 'uuuu-MM-dd'
Posted
技术标签:
【中文标题】使用 java 8 和格式将字符串转换为日期 -> \'uuuu-MM-dd\'【英文标题】:convert String to date using java 8 and format -> 'uuuu-MM-dd'使用 java 8 和格式将字符串转换为日期 -> 'uuuu-MM-dd' 【发布时间】:2017-03-24 07:37:06 【问题描述】:我想使用 Java 8 从字符串转换为日期。
我可以使用SimpleDateFormat
和yyyy-MM-dd
格式轻松转换
String startDate2="2017-03-24";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(new java.sql.Date(sdf1.parse(startDate2).getTime()));
输出: 2017-03-24
String startDate2="2017-03-24";
SimpleDateFormat sdf1 = new SimpleDateFormat("uuuu-MM-dd");
System.out.println(new java.sql.Date(sdf1.parse(startDate2).getTime()));
但是当我使用'uuuu-MM-dd'
而不是'yyyy-MM-dd'
时
输出:
1970-03-24
(错)
现在在 Java 8 中:
String startDate1="2017-03-23";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd");
但我不知道如何获得与上述正确输出相同的 sql 日期类型的日期。
【问题讨论】:
为什么不在 Java8 中使用相同的模式? Jens 你能提供准确的输出而不是判断,因为当我使用'uuuu-MM-dd'时输出是错误的 编辑后不清楚你想要什么? 我想要使用 java 8 的 sql 日期类型 见这里:***.com/questions/530012/… 【参考方案1】:java.sql.Date
有一个静态的 valueOf
方法,它采用 Java 8 LocalDate
,所以你可以这样做:
String startDate1 = "2017-03-23";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd");
LocalDate date = LocalDate.parse(startDate1, formatter);
java.sql.Date sqlDate = java.sql.Date.valueOf(date);
【讨论】:
是的,必须使用 LocalDate。 Java 8 日期/时间类不会直接转换为旧式日期类 但是当我使用 'uuuu' 而不是 'yyyy' 时,为什么 SimpleDateFormat 会给出错误的输出? 因为“u”在SimpleDateFormat
中表示“星期几”。它仅表示DateTimeFormatter
中的年份
@greg-449 不需要那种格式模式。该模式由 ISO 8601 标准定义,java.time 在解析和生成字符串时默认使用标准格式。 LocalDate.parse( "2017-03-23" )
你甚至可以将它们组合在一起:java.sql.Date.valueOf( LocalDate.parse( "2017-03-23" ) )
【参考方案2】:
据我所知,您有一个 yyyy-MM-dd 格式的文本,并且您希望它采用 uuuu-MM-dd 格式。所以你需要两种格式:
String startDate2="2017-03-24";
SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat targetFormat = new SimpleDateFormat("uuuu-MM-dd");
java.sql.Date date = new java.sql.Date(sourceFormat.parse(startDate2).getTime());
String formattedAsDayOfWeek = targetFormat.format(date);
System.out.println(formattedAsDayOfWeek);
底线是Date
包含一个毫秒值。 java.sql.Date.toString()
使用 yyyy-MM-dd
格式,无论您如何解析它。 java.util.sql.Date
使用另一种格式:EEE MMM dd hh:mm:ss zzz yyyy
和英文Locale
。
您可以使用DateFormat
-s 进行其他格式化。
我认为您需要uuuu-MM-dd
格式来将数据插入数据库。 那个逻辑是什么样的?
【讨论】:
Tamas 我用 'uuuu-MM-dd' 而不是 yyyy-MM-dd 你可以看到这个docs.oracle.com/javase/8/docs/api/java/time/format/… @jitendravarshney 你输入的日期,`String startDate2="2017-03-24";` 是yyyy-MM-dd
格式,只要你使用SimpleDateFormat
。 IE。 SimpleDateFormat
是 DateFormat
的子类。另一方面,您正在尝试使用DateTimeFormatter
,它使用另一组模式字符。
你能给我一个'uuuu-MM-dd'的例子吗@Tamas
@jitendravarshney 如果你像SimpleDateFormat
一样使用DateFormat
,那么uuuu-MM-dd 将是0005-03-24
,但这有点没有意义。另一方面,如果你解释如果机智@ 987654339@,那么2017-03-24
就是一个很好的例子。【参考方案3】:
你不想要java.sql.Date
。你想要一个LocalDate
。您的 SQL 数据库也需要一个。
String startDate2 = "2017-03-24";
LocalDate date = LocalDate.parse(startDate2);
System.out.println(date);
输出是:
2017-03-24
我正在利用您的字符串采用 ISO 8601 格式这一事实。包括LocalDate
在内的java.time 类将这种格式解析为默认格式,即不使用任何显式格式化程序。
您还注意到,我们不需要任何显式格式化程序来将输出格式化回uuuu-MM-dd
格式。从System..out.println()
隐式调用的toString
方法会返回ISO 8601 格式。
假设您使用的是符合 JDBC 4.2 的驱动程序(我想我们现在都在使用),我正在采取将其从 this question: Insert & fetch java.time.LocalDate objects to/from an SQL database such as H2 传递到您的 SQL 数据库的方式:
myPreparedStatement.setObject ( 1 , date ); // Automatic detection and conversion of data type.
有关更多详细信息,请参阅链接的问题。
java.sql.Date
类设计不佳,是对已经设计不佳的java.util.Date
类的真正破解。这两个课程都已经过时了。不要再使用它们了。
另一个链接:Wikipedia article: ISO 8601
【讨论】:
以上是关于使用 java 8 和格式将字符串转换为日期 -> 'uuuu-MM-dd'的主要内容,如果未能解决你的问题,请参考以下文章