具有不同时区日期的java.Util.Date对象

时间:2016-01-21 12:02:45

标签: java date

我正在尝试创建一个日期对象,其时间表示不同时区的日期时间。可能吗?我试过这个。有人可以解释这里有什么问题。

d1= Thu Jan 21 17:26:20 IST 2016
dateInString= Jan 21, 2016 06:56:20 AM EST
d2= Thu Jan 21 17:26:20 IST 2016

输出:

public static void test3() {

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

    Date d1 = calendar.getTime();
    System.out.println("d1= " + d1);

    SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
    SimpleDateFormat sdf2 = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
    sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));

    String dateInString = sdf.format(calendar.getTime());
    System.out.println("dateInString= " + dateInString);

    try {
        Date d2 = sdf2.parse(dateInString);
        System.out.println("d2= " + d2);
    }
    catch (ParseException e) {
        e.printStackTrace();
    }
}

更新

如果我不关心时区而只需要时间,我有一个Date对象,用错误的时区显示时间。使用了SDF的新实例

d1= Thu Jan 21 18:36:51 IST 2016
dateInString= Jan 21, 2016 08:06:51 AM
d2= Thu Jan 21 08:06:51 IST 2016

enter code here

输出:

childViewController

3 个答案:

答案 0 :(得分:1)

试试这个:

Date date = Calendar.getInstance().getTime();
SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
sdfAmerica.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String sDateInAmerica = sdfAmerica.format(date);

答案 1 :(得分:0)

日期旨在存储UTC时间(请参阅docs)。如果您希望有时间用于其他时区并且您不想格式化,我建议您使用Calendar个对象(请参阅docs)。

对于你作为Java 7开发人员:一般来说,我建议使用Calendar个对象而不是Date个对象,因为更容易操作(例如增加时间)和更直观的api。

答案 2 :(得分:0)

您可以通过以下方式解决此问题

SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
sdfAmerica.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date newDate = sdfAmerica.parse(sdfAmerica.format(Calendar.getInstance().getTime()));