Joda Time没有得到预期的结果

时间:2012-11-27 07:11:30

标签: java datetime jodatime

我有一个格式为MM/dd/yyyy的日期字符串,我使用SimpleDateFormat解析

现在说下面给出的代码startDateString11/26/2012。我将时区设置为 America / New_York

SimpleDateFormat df=new SimpleDateFormat("MM/dd/yyyy");

Date st = df.parse(startDateString);

Calendar startDate = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));

System.out.println("BEFORE : Start Date :"+startDate.getTime());

startDate.setTime(st);

System.out.println("AFTER : Start Date :"+startDate.getTime());

DateTimeZone timezone = DateTimeZone.forID("America/New_York");

DateTime actualStartDate = new DateTime(startDate,timezone);

System.out.println("JODA DATE TIME "+ actualStartDate);

以上代码段的输出:

BEFORE : Start Date :Tue Nov 27 12:26:51 IST 2012

AFTER : Start Date :Mon Nov 26 00:00:00 IST 2012 //ok it sets date to 26th
                                                 //with all time parameters as 0.

JODA DATE TIME 2012-11-25T13:30:00.000-05:00 // here the date and 
                                             // time parameter are changed

当我像这样创建actualStartDate时,我的问题是什么:

DateTime actualStartDate = new DateTime(startDate,timezone);

日期变为25,时间变为13:00:00
我认为这是因为印度和美国之间的时区差异(印度时报总时间为-10:30)

我想要的是JODA DATE TIME 2012-11-26T00:00:00.000-05:00

我是否可以手动将startDate日历实例中的时间参数设置为0

1 个答案:

答案 0 :(得分:3)

我怀疑问题是您在默认时区解析。这样:

AFTER : Start Date :Mon Nov 26 00:00:00 IST 2012

表示您使用的时间是午夜 IST - 不是纽约午夜或UTC。目前IST是UTC的18:30,所以你代表的瞬间是25-11-25T18:30:00Z。

当你把它转换成纽约时间时,你最终会得到2012-11-25T13:30:00-05:00,这正是Joda Time所做的。

我强烈建议:

  • 你完全避免使用Java库(这就是所有问题都来自这里 - 在解析和Date.toString()混淆你的结果时)
  • 您使用LocalDate来表示日期,而不是DateTime。你毕竟想要代表一个日期,而不是瞬间。这完全绕过了时区,因为日期 没有时区。

示例代码:

import java.util.*;

import org.joda.time.*;
import org.joda.time.format.*;

public class Test {
    public static void main (String[] args) {
        String text = "11/26/2012";
        DateTimeFormatter formatter =
            DateTimeFormat.forPattern("MM/dd/yyyy")
                          .withLocale(Locale.US);

        LocalDate date = formatter.parseLocalDate(text);
        System.out.println(date);
    }    
}

一旦你 得到LocalDate,如果你想知道当天在特定时区开始的那一天,你可以使用LocalDate.toDateTimeAtStartOfDay(DateTimeZone)