【问题标题】:Change the date time format of an existing DateTime instance of Joda更改 Joda 的现有 DateTime 实例的日期时间格式
【发布时间】:2013-02-19 04:05:04
【问题描述】:

我有两个日期字段。用户可以从 jQuery 日期时间选择器中选择一个日期,然后将其转换为 UTC 格式(通过 Spring 的自定义属性编辑器)并在提交表单时填充到 Java bean 中。

这些来自 Java bean 的 DateTime 实例由 org.apache.commons.beanutils.PropertyUtils 通过反射检索,例如,

final Object object1 = PropertyUtils.getProperty(beanObject, firstDate);
final Object object2 = PropertyUtils.getProperty(beanObject, secondDate);

这些对象类型转换为DateTime

if(object1!=null && object2!=null)
{
    final DateTime startDate=((DateTime)object1).withZone(DateTimeZone.forID("Asia/Kolkata"));
    final DateTime endDate=((DateTime)object2).withZone(DateTimeZone.forID("Asia/Kolkata"));

    System.out.println("startDate = "+startDate+"\nendDate = "+endDate);
}

这会产生以下输出。

startDate = 2013-02-17T22:45:59.000+05:30
endDate = 2013-02-18T22:46:00.000+05:30

我需要将这些日期转换成这种格式 - dd-MMM-yyyy HH:mm:ss

我尝试过的以下方法不起作用。

DateTime newStartDate=new DateTime(startDate.toString("dd-MMM-yyyy HH:mm:ss"));
DateTime newEndDate=new DateTime(startDate.toString("dd-MMM-yyyy HH:mm:ss"));

System.out.println("newStartDate = "+newStartDate+"\nnewEndDate = "+newEndDate);

它给出了以下异常。

java.lang.IllegalArgumentException:无效格式:“2013 年 2 月 17 日 22:45:59”在“-Feb-2013 22:45:59”格式不正确

那么如何将这些日期转换成需要的格式呢?

【问题讨论】:

    标签: java datetime jodatime


    【解决方案1】:

    DateTime 没有任何格式。它有一个值,即自 1970 年 1 月 1 日以来的毫秒数,以及一个年表。只有当您将 DateTime 转换为 String 时,您才需要选择格式。而且您已经知道如何做到这一点,因为您在问题中就这样做了。

    所以你试图做的只是没有意义。

    【讨论】:

    • 我没有在我的问题中提到,但实际上,我想比较两个日期,如果一个日期早、晚或等于另一个忽略第二部分 DateTime(即仅将它们与 HH:mm 进行比较,而不与 HH:mm:ss 进行比较)。完全忽略时间部分对于 Joda 来说很容易,并且可以立即完成,例如 -if(DateTimeComparator.getDateOnlyInstance().compare(startDate, endDate)==0){...}(为了平等)。但我不确定如何忽略DateTime(在我的情况下为ss)中的特定部分。这可能吗?谢谢。
    • DateTime dateTimeWithoutSeconds = originalDateTime.withMillis(0).withSecondOfMinute(0); 让您获得与第一个相同的 anotherDateTime,但将秒数和毫秒设置为 0。对两个实例都这样做,并比较各自的结果。 joda-time.sourceforge.net/api-release/index.html
    • final DateTime startDate=((DateTime)object1).withZone(DateTimeZone.forID("Asia/Kolkata")).withMillis(0).withSecondOfMinute(0); 返回startDate = 1970-01-01T05:30:00.000+05:30
    • 是的,那又怎样?那正是你想要的。日期不再有秒和毫秒。现在比较这两个日期,看看哪个日期最大。
    • DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata")); DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillis(0); DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillis(0); 然后将它们与firstDate.isBefore(secondDate)firstDate.isAfter(secondDate)firstDate.equals(secondDate) 进行比较,分别返回falsefalsetrue。由于这不是实际问题,因此我将其作为一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多