有没有一种简单的方法可以将 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 ZONE
和 TIMESTAMP 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时间日期格式化的几种方法(案例说明)