java - 将 Joda-Time DateTime - ISO 8601 格式日期转换为另一种日期格式

标签 java jodatime

在我的 Java 应用程序中,我使用 Joda-Time将应用程序用户输入的日期从 MM/dd/yyyy 转换为 ISO 8601 格式,以便将其保存在数据库中。

谁能告诉我如何转换 ISO 8601使用 Joda-Time 追溯到 MM/dd/yyyy 格式?

我的代码将用户日期转换为 ISO 8601 日期格式:

String date1 = "05/05/2013";
DateTimeFormatter parser1 = DateTimeFormat.forPattern("MM/dd/yyyy");
DateTime dateTimeObj1 = DateTime.parse(date1,parser1);
DateTimeFormatter isoDateFormat = ISODateTimeFormat.dateTime();
String isoDateStr = isoDateFormat.print(dateTimeObj1);
System.out.println(isoDateStr);

最佳答案

使用相同的格式化程序

使用相同的 DateTimeFormatter 对象来解析 Joda-Time 中的 print(呈现字符串) 2.3.

时区

请注意,您的代码忽略了地址 time zone .在这种情况下,您将获得 JVM 的默认时区。这不是一个好的做法。

DateTime 代表日期和时间。当仅针对日期部分解析字符串时,时间部分会自动设置为当天的第一时刻。第一时刻因时区而异。因此,应用不同的时区会产生不同的结果,宇宙时间轴上的不同点,不同的自纪元以来的毫秒数。

请注意对 withZone 的调用在定义格式化程序时。

字符串

请记住,DateTime 对象不是字符串。您可以通过以下任一方式生成 DateTime 中包含的日期时间信息的字符串表示形式:

  • 在 DateTime 实例上调用 toString 方法。
    每个 DateTime 都有一个内置的 ISO 8601formatter ,由“toString”方法自动使用。
  • 实例化您自己的 DateTimeFormatter 实例。

这两种字符串生成技术都可以在下面的示例代码中看到。

示例代码

// Usually better to specify a time zone than rely on default.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Hong_Kong" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );

// Parse string into a DateTime. Define the format.
String input = "05/05/2013";
DateTime dateTime = formatter.parseDateTime( input ); // Defaults to first moment of the day.

// Render date-time as an ISO 8601 string. The "toString" method on DateTime defaults to a built-in ISO 8601 formatter.
// A DateTime object is not itself a string. But a DateTime can generate a string by calling its "toString" method.
String iso8601String = dateTime.toString();

// Parse string into a DateTime. Passing to constructor conveniently uses the built-in ISO 8601 parser built into DateTime class.
DateTime dateTime2 = new DateTime( iso8601String, timeZone );

// Render date-time as a string in a particular format.
String output = formatter.print( dateTime2 );

您可以对本地化格式进行软编码,而不是对特定格式进行硬编码。

String outputUS = DateTimeFormat.forStyle( "S-" ).withLocale( Locale.US ).print( dateTime2 );
String outputQuébécois = DateTimeFormat.forStyle( "F-" ).withLocale( Locale.CANADA_FRENCH ).print( dateTime2 );

转储到控制台...

System.out.println( "dateTime: " + dateTime ); // Implicit call to "toString" method in DateTime class generates a new string using a built-in formatter for ISO 8601 format.
System.out.println( "iso8601String: " + iso8601String );
System.out.println( "dateTime2: " + dateTime2 ); // Another implicit call to "toString" method on DateTime class. Generates a new string in ISO format.
System.out.println( "output: " + output );

运行时……

dateTime: 2013-05-05T00:00:00.000+08:00
iso8601String: 2013-05-05T00:00:00.000+08:00
dateTime2: 2013-05-05T00:00:00.000+08:00
output: 05/05/2013

字符串不是日期时间

不要将日期时间对象视为字符串。

DateTime 没有格式。该类可以解析 ISO 8601 格式的字符串以实例化日期时间对象。同样,DateTimeFormatter 可以解析字符串以实例化日期时间对象。

相反,DateTime 有一个 toString 实现,它生成日期时间对象值的字符串表示形式。同样,DateTimeFormatter 可以生成日期时间对象值的字符串表示形式。

在所有这些情况下,字符串表示完全不同并且与日期时间对象分开。

关于java - 将 Joda-Time DateTime - ISO 8601 格式日期转换为另一种日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505858/

相关文章:

java - JAR - 提取特定文件

java - Java自动生成HTML页面

java - Joda Time 使用时区解析日期并保留该时区

java.lang.NoClassDefFoundError : org/hibernate/type/StandardBasicTypes - What could be the reason? 错误

java - 如何在 JodaTime 中创建几天的迭代器

java - ActiveMQ 的 NoSuchMethodError

java - Android 将字符串转换为 ObjectInputStream

java - 从另一个类访问随机变量

jodatime - Joda DateTime 与 PeriodFormat 的差异,如 1 :30

java - Joda-Time 的大致时间段