【问题标题】:Convert date or calendar type into string format将日期或日历类型转换为字符串格式
【发布时间】:2013-06-26 12:18:02
【问题描述】:

所以,基本上我试图在字符串中实现以下格式:

2012-06-17T08:00:00.000+01:00

我以字符串格式获取原始日期,然后将其解析为不同的格式。

当我使用格式为 (yyyy-MM-dd'T'HH:mm:ss.sssZ) 的 SimpleDateFormat 时,我得到以下输出:

2013-06-17T07:00:00.000+0530

这里 +0530 应该是 +05:30

当我将上述日期设置为日历类型,然后将其转换为字符串时,我得到以下格式:

2013-06-17T07:00:00+05:30

几秒后我没有得到 .000。

任何想法如何在不使用 JodaTime 的情况下实现这一点。只需要对日期、字符串和日历类型进行操作

【问题讨论】:

  • 查看 Java 文档 here s 指的是秒,S 指的是毫秒。

标签: java date calendar type-conversion


【解决方案1】:

首先要获得额外的: 在你的格式化程序中使用XXX,然后使用大写S 来获取毫秒数

   SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")

更新:以上不适用于 1.6

不过,你可以尝试以下方法

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
{
    public StringBuffer format(Date date, StringBuffer toAppendTo, java.text.FieldPosition pos) 
    {
        StringBuffer toFix = super.format(date, toAppendTo, pos);
        return toFix.insert(toFix.length()-2, ':');
    };

this post for more

【讨论】:

  • 谢谢,没看到那部分
  • 获取 java.lang.IllegalArgumentException:非法模式字符 'X'
  • @sanbhat 开,1.6 你不走运。它不支持 ISO 8601 时区。
【解决方案2】:

SimpleDateFormat 模式

"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

【讨论】:

  • 开,1.6 你倒霉了。它不支持 ISO 8601 时区。
  • 如果 GMT-08:00 适合您,请在 1.6 上尝试 zzz
  • Calendar 类型怎么样,我们不能在那里玩一下格式吗?
  • 日历不支持格式化。它的toString() 方法有一个固定的输出格式,可以在两个Java 版本之间改变。仅用于调试。
  • @Punkeshwar 在 Joda 时代,您可以按照此 SO post 中的说明进行操作。
【解决方案3】:

tl;博士

OffsetDateTime.parse( "2012-06-17T08:00:00.000+01:00" )  // Parse string in standard ISO 8601 format to an object.
              .format(                                   // Generate a String representing the value of that `OffsetDateTime` object.
                  DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX" )  // Specify a formatting pattern to force the seconds and fractional second even if zero.
              )                                          // Return a `String` object.

2012-06-17T08:00:00.000+01:00

java.time

现代方法使用 java.time 类而不是麻烦的旧旧日期时间类。避免使用DateCalendarSimpleDateFormat

ISO 8601

您想要的格式恰好是标准 ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用标准格式。所以不需要指定格式模式。

OffsetDateTime

您的输入字符串包含偏移量,但不包含时区。所以我们解析为OffsetDateTime 对象。

OffsetDateTime odt = OffsetDateTime.parse( "2012-06-17T08:00:00.000+01:00" ) ;

要生成相同标准 ISO 8601 格式的字符串,只需调用 toString。默认情况下,如果为零,则忽略最不重要的部分。因此,使用您的示例数据不会出现秒或小数秒。

String output = odt.toString() ;

2012-06-17T08:00+01:00

如果您想强制秒和小数秒,即使为零,请指定格式模式。

OffsetDateTime odt = OffsetDateTime.parse( "2012-06-17T08:00:00.000+01:00" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX" );
String output = odt.format( f );

2012-06-17T08:00:00.000+01:00


关于java.time

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

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

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

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

  • Java SE 8Java SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实现。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6Java SE 7
    • 大部分 java.time 功能都在ThreeTen-Backport 中向后移植到 Java 6 和 7。
  • Android
    • java.time 类的 Android 捆绑包实现的更高版本。
    • 对于早期的 Android (ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

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

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多