有没有一种简单的方法可以将 Date(sql) 转换为以下格式 Month(3 character) day(int) , year(2014)

Posted

技术标签:

【中文标题】有没有一种简单的方法可以将 Date(sql) 转换为以下格式 Month(3 character) day(int) , year(2014)【英文标题】:is there a simple way to convert Date(sql) to following format Month(3 character) day(int) , year(2014) 【发布时间】:2014-05-18 15:31:03 【问题描述】:

有没有一种简单的方法可以将 Date(sql) 转换为以下格式 Month(3 character) day(int) , year(int)?

例如: 2014 年 1 月 3 日 2014 年 2 月 2 日 我有这个:“2014-02-14”

(我在客户端使用 postgresql、java 和 javascript

【问题讨论】:

【参考方案1】:

假设,如果您想在数据库端本身实现这一点。然后使用下面的 sql 查询。

假设“堆栈”是包含您的 DATE 值的列,即“2014-02-14”

select to_char(stack,'Mon dd, YYYY') from testing;
to_char -- 2014 年 2 月 14 日

【讨论】:

【参考方案2】:

看看 Java 的 SimpleDateFormat API

你可以这样做——

SimpleDateFormat format = new SimpleDateFormat("MMM dd, YYYY");
String dateString = format.format(date); // Pass your SQL date object here

【讨论】:

【参考方案3】:

这将起作用:

    SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy");

    SimpleDateFormat sqlformat = new SimpleDateFormat("yyyy-mm-dd");

    java.util.Date date;
    try 
        date = sqlformat.parse("2014-02-14");
        String result = format.format(date);
        System.out.println(result);
     catch (ParseException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     // Pass your SQL date object here

【讨论】:

谢谢,但现在它总是返回一月份的月份【参考方案4】:

简答

在 Joda-Time 2.3 中(替换您想要的时区和区域设置)...

String output = DateTimeFormat.forStyle( "M-" ).withLocale( new java.util.Locale( "fr", "CA" ).withTimeZone( "America/Montreal").print( new DateTime( myJavaDotSqlDotJavaObject ) );

日期时间对象没有格式

您犯了将日期时间值与其字符串表示混为一谈的常见错误。 java.sql.Date 对象没有字符串格式。您可以从日期时间对象生成字符串表示,但两者是独立的独立对象。

ISO 8601

您提到的格式是由ISO 8601 标准定义的。 Joda-Time 日期时间库使用 ISO 8601 作为输入和输出的默认值。

时区

问题和其他答案都忽略了时区的关键问题。

确定今天是哪一天(昨天、今天、明天)取决于您所在的时区。虽然 2 月 2 日在巴黎迎来了新的一天,但在蒙特利尔,这一日期仍然是 2 月 1 日。

java.sql.Date 实例没有时区。它的内部日期时间值实际上是UTC(无偏移)。

体面的日期时间库

Java 中捆绑的 java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。使用任一:

Joda-Time Java 8 中的新 java.time package。

乔达时间

Joda-Time 2.3 中的一些示例代码。

获取当前日期时间。

DateTimeZone timeZoneParis = DateTimeZone.forID( "Europe/Paris" );
DateTime nowInParis = DateTime.now( timeZone );

要将您的 java.sql.Date 实例转换为 Joda-Time 对象,只需将其传递给构造函数即可。请务必包含要分配给 Joda-Time DateTime 对象的时区。如果省略时区,则分配 JVM 的默认时区。

DateTime dateTimeInParis = new DateTime( myJavaDotSqlDotDateObject, timeZoneParis );

调整时区。

DateTimeZone timeZoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime nowInMontréal = nowInParis.withTimeZone( timeZone );

您可以调整为 UTC。这可能有助于调试,以验证存储在数据库中的 UTC 值。 Postgres 始终以 UTC 格式存储 TIMESTAMP 类型。我重复一遍:both TIMESTAMP WITH TIME ZONETIMESTAMP WITHOUT TIME ZONE 类型都存储在 UTC 中。 'with' 或 'without' 名称具有误导性,因为它们不是指存储,而是指在插入数据库或从数据库检索期间是否遵守时区。 Expert advice says:始终使用TIMESTAMP WITH TIME ZONE

DateTime dateTimeInUtc = nowInMontréal.withTimeZone( DateTimeZone.UTC );

使用内置的 ISO 8601 格式化程序之一生成日期时间值的字符串表示形式。对于您提到的仅日期YYYY-MM-DD 格式,请调用工厂方法ISODateTimeFormat.date()

对于您想要的MMM DD, YYYY 格式,我建议您改用本地化格式。有关示例,请参见此答案顶部的代码行。传递“M-”以生成日期部分的中等长度字符串表示,同时省略时间部分。通过“F”、“L”、“M”或“S”表示完整、长、中和短。

如果您坚持使用您指定的格式,您可以使用DateTimeFormat.forPattern 方法创建一个格式化程序。在 *** 中搜索许多示例。

请注意,格式化程序可以将时区调整作为其过程的一部分,作为我们上面看到的时区调整的替代方案。格式化程序也可以本地化。

DateTimeFormat formatter = ISODateTimeFormat.date().withTimeZone( timeZoneMontréal ).withLocale( new java.util.Locale( "fr", "CA" ); // Factory producing formatters.
String outputDateOnlyInMontréal = formatter.print( nowInParis );

【讨论】:

以上是关于有没有一种简单的方法可以将 Date(sql) 转换为以下格式 Month(3 character) day(int) , year(2014)的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以将数据库 SQL 脚本文件分解为每个对象一个文件?

java.util.Date和java.sql.Date的区别和相互转化(转)

java.util.Date和java.sql.Date的区别和相互转化(转)

(转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

(转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

sql如何将字符串转为日期