【问题标题】:Best way to convert Java SQL Date from yyyy-MM-dd to dd MMMM yyyy format将 Java SQL 日期从 yyyy-MM-dd 转换为 dd MMMM yyyy 格式的最佳方法
【发布时间】:2011-03-11 20:35:27
【问题描述】:

有没有直接的方法将 Java SQL 日期从格式 yyyy-MM-dd 转换为 dd MMMM yyyy 格式?

我可以将日期转换为字符串,然后对其进行操作,但我宁愿将其保留为 Java SQL 日期。在我需要这样做的时候,数据已经从 MySQL 数据库中读取,所以我不能在那里进行更改。

【问题讨论】:

    标签: java date format


    【解决方案1】:

    java.sql.Datejava.util.Date(其中java.sql.Date 是一个子类)等对象本身没有格式。您使用java.text.DateFormat 对象以特定格式显示这些对象,而确定格式的是DateFormat(而不是Date 本身)。

    例如:

    Date date = ...;  // wherever you get this
    DateFormat df = new SimpleDateFormat("dd MMMM yyyy");
    String text = df.format(date);
    System.out.println(text);
    

    注意:当您打印 Date 对象而不使用 DateFormat 对象时,如下所示:

    Date date = ...;
    System.out.println(date);
    

    然后它将使用一些默认格式进行格式化。但是,该默认格式不是您可以更改的 Date 对象的属性。

    【讨论】:

    • 谢谢。我做了类似的事情,将日期写入 servlet 中的数组列表,然后重新格式化为字符串。然后将此数组列表设置为会话变量并在 JSP 中处理。
    【解决方案2】:

    如果是用于演示,您可以立即使用 SimpleDateFormat:

    package org.experiment;
    
    import java.sql.Date;
    import java.text.SimpleDateFormat;
    
    public class Dates {
        private static SimpleDateFormat df = new SimpleDateFormat("MMMM yyyy");
    
        public static void main(String[] args){
    
            Date oneDate = new Date(new java.util.Date().getTime());
            System.out.println(df.format(oneDate));
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      不清楚您所说的“Java SQL 日期”是什么意思。如果您的意思是java.sql.Date,那么它实际上并没有 字符串格式……它只是一个数字。要以特定方式中对其进行格式化,请使用java.text.SimpleDateFormat 之类的内容。

      或者,将其转换为 Joda Time DateTime; Joda Time 是一种比内置 API 更好的日期和时间 API。例如,SimpleDateFormat 不是线程安全的。

      (请注意,java.sql.Date 比普通的 java.util.Date 具有更高的精度,但看起来您在这里不需要。)

      【讨论】:

        【解决方案4】:

        tl;博士

        myJavaSqlDate.toLocalDate()
                     .format(
                         DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG )
                                          .withLocale ( Locale.UK )
                     )
        

        2017 年 5 月 11 日

        不要将日期时间值与其文本表示混为一谈

        正如其他人所说,日期时间对象具有格式。只有从对象生成或由对象解析的字符串才有格式。但是这样的字符串总是与日期时间对象分开和不同的。

        使用对象,而不是字符串

        避免使用字符串将日期时间值与数据库进行通信。对于日期时间值,使用日期时间类来实例化日期时间对象。

        JDBC 的真正目的是调解您的数据库和 Java 之间的类型差异。

        使用 java.time

        其他答案已过时,因为它们使用麻烦的旧旧日期时间类或古老的 Joda-Time 库。两者都已被 java.time 类所取代。

        如果您手头有一个java.sql.Date 对象,请通过调用添加到旧类的新方法toLocalDate 转换为java.time.LocalDate

        LocalDate ld = myJavaSqlDate.toLocalDate() ;
        

        对于符合JDBC 4.2 及更高版本的JDBC drivers,您可以直接使用java.time 类型。

        您似乎对仅日期值感兴趣。所以使用LocalDateLocalDate 类表示没有时间和时区的仅日期值。

        要生成所需格式的字符串,您可以指定自定义格式模式。但我建议让 java.time 自动本地化。

        要本地化,请指定:

        • FormatStyle 确定字符串的长度或缩写。
        • Locale 确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。

        例子……

        LocalDate ld = LocalDate.now ( ZoneId.of ( "America/Montreal" ) );  // Today's date at this moment in that zone.
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.UK );
        String output = ld.format ( f );
        

        输出:2017 年 5 月 11 日


        关于java.time

        java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

        Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

        要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

        从哪里获得 java.time 类?

        ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-22
          • 1970-01-01
          • 2017-06-24
          • 2023-03-15
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多