使用 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 从字符串转换为日期。

我可以使用SimpleDateFormatyyyy-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。 SimpleDateFormatDateFormat 的子类。另一方面,您正在尝试使用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'的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Java 日期字符串/对象转换为 JFreeChart 日期格式?

Java日期格式转换

将 Java 日期转换为 XML 日期格式(反之亦然)

如何把Excel中的8位的日期字符串转换为日期

sql怎么把字符串转换为日期格式

java字符串转换成日期