格式的日期

时间:2014-08-20 19:39:29

标签: java date datetime jodatime

我有这段代码

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'-'hh:mm")
DateTime dateTime1 = new DateTime()
println("dateTime1 : " + dateTime1)
DateTime formattedDate = fmt.parseDateTime(dateTime1.toString());
println("formattedDate : " + formattedDate)
DateTimeFormatter finalFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm'-'hh:mm");
System.out.println("formatted date : " + finalFormat.print(formattedDate));

打印出类似这样的内容:

dateTime1 : 2014-08-20T15:34:17.256-04:00
formattedDate : 2014-08-20T16:00:17.256-04:00
formatted date : 2014-08-20T16:00-04:00

我想要一个完全符合这种格式的日期(因为这些是要求)

2014-08-20T15:34-04:00

的问题
formattedDate : 2014-08-20T16:00:17.256-04:00
formatted date : 2014-08-20T16:00-04:00

是时差,它始终打印出来' 16:00-04:00'

我该怎么做?从数据库中检索日期,该数据库将转换为DateTime对象。

当我尝试这个时:

    DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    DateTime dateTime1 = new DateTime()
    println("dateTime1 : " + dateTime1)
    DateTime formattedDate = fmt.parseDateTime(dateTime1.toString());
    println("formattedDate : " + formattedDate)
    DateTimeFormatter finalFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm'-'hh:mm");
    System.out.println("formatted date : " + finalFormat.print(formattedDate));

输出变化:

    dateTime1 : 2014-08-20T15:59:34.876-04:00
    formattedDate : 2014-08-20T15:59:34.876-04:00
    formatted date : 2014-08-20T15:59-03:59

应该是-04.00。但是回来的时候是' -03:59',这是错误的。

非常感谢任何帮助。

由于

4 个答案:

答案 0 :(得分:0)

问题在于你的模式

"yyyy-MM-dd'T'HH:mm'-'hh:mm"

当您添加'hh:mm'时,您将再次读取时间为04:00,但由于已经读取它已经是PM时间,因此它变为16:00。您应该将时区读作Z的时区,而不是时间本身的一部分。

来自DateTimeFormat

的Javadoc
Symbol  Meaning              Presentation  Examples  
------  -------              ------------  -------
Z       time zone offset/id  zone          -0800; -08:00; America/Los_Angeles

Zone: 'Z' outputs offset without a colon, 'ZZ' outputs the offset with a colon, 'ZZZ' or more outputs the zone id.

我建议你使用

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")

注意:末尾的-不是分隔符,而是减号。我猜-04:00时区是AEST时区。

答案 1 :(得分:0)

您的时间格式不正确,更具体地说,最后一部分会将时区解析为时间(小时和分钟)。请尝试使用此代码:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")

答案 2 :(得分:0)

您的偏移格式不正确ZZ是带冒号的时区,您需要添加withOffsetParsed() -

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mmZZ");
String dateTime1 = "2014-08-20T15:34-04:00";
DateTime formattedDate = fmt.withOffsetParsed().parseDateTime(dateTime1);
System.out.println("formattedDate : " + formattedDate);
System.out.println("formatted date : " + fmt.print(formattedDate));

输出

formattedDate : 2014-08-20T15:34:00.000-04:00
formatted date : 2014-08-20T15:34-04:00

来自DateTimeFormat javadoc

  

区域:'Z'输出不带冒号的偏移量,'ZZ'输出带冒号的偏移量,'ZZZ'或更多输出区域ID。

答案 3 :(得分:0)

其他答案都是正确的。

但您可以更简单地使用built-in formatter生成格式yyyy-MM-dd'T'HH:mm

DateTimeFormatter formatter = ISODateTimeFormat.dateHourMinute().withZone( DateTimeZone.UTC ) ; 
String output = formatter.print( DateTime.now() ) + "Z";