Java中使用SimpleDataFormat进行时区转换

Java中使用SimpleDataFormat进行时区转换,java,simpledateformat,Java,Simpledateformat,我有一个SimpleDataFormat解析器,它以这种方式进行解析: sdf = new java.text.SimpleDateFormat("yyyy-MM-DD HH:mm:ss z").parse("2013-10-25 17:35:14 EDT"); log.debug(sdf); 这给我2013年1月26日星期六03:05:14 我在这里遗漏了什么?首先,DD代表一年中的一天,你应该用DD来代替 此外,如果要以特定格式打印日期,则需要使用两种SimpleDateFormats

我有一个SimpleDataFormat解析器,它以这种方式进行解析:

sdf = new java.text.SimpleDateFormat("yyyy-MM-DD HH:mm:ss z").parse("2013-10-25 17:35:14 EDT");

log.debug(sdf);
这给我2013年1月26日星期六03:05:14


我在这里遗漏了什么?

首先,DD代表一年中的一天,你应该用DD来代替

此外,如果要以特定格式打印日期,则需要使用两种
SimpleDateFormat
s

simpleDataFormat.parse
返回一个
Date
对象,该对象表示以给定格式指定的日期

日期
对象本身保存为常规的
日期
没有附加格式


如果要以特定格式打印,需要使用另一种
SimpleDateFormat
并调用
format
方法。

首先,DD代表一年中的一天,应该使用DD

此外,如果要以特定格式打印日期,则需要使用两种
SimpleDateFormat
s

simpleDataFormat.parse
返回一个
Date
对象,该对象表示以给定格式指定的日期

日期
对象本身保存为常规的
日期
没有附加格式


如果要以特定格式打印,需要使用另一种
SimpleDateFormat
并调用
format
方法。

您应该使用格式

SimpleDateFormat sdf1 =  new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:SS z");
String sdf = sdf1.format(sdf1.parse("2013-10-25 17:35:14 EDT"));

您应该使用格式

SimpleDateFormat sdf1 =  new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:SS z");
String sdf = sdf1.format(sdf1.parse("2013-10-25 17:35:14 EDT"));
有两件事

sdf
Date
的对象,它表示一个特定的时间瞬间(从另一个被称为“历元”的瞬间开始经过的毫秒)。此对象不知道任何格式。该对象的打印方式完全由其类的方法处理,该方法以以下格式打印日期:

dow mon dd hh:mm:ss zzz yyyy
这正是您在输出中看到的。请注意,在这种情况下会打印运行程序的机器的时区。如果您希望以您选择的格式打印此对象,则应使用。要获取特定时区的输出,必须明确地将其告知
DateFormat
对象(见下文)

另一件事是您应该在模式中使用
dd
而不是
dd
D
代表一年中的一天,
D
代表一个月中的一天,我相信这就是你想要的。现在记住这两点,这是解决问题的方法之一:

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("EDT")); // Time Zone for output
Date d = sdf.parse("2013-10-25 17:35:14 EDT");
System.out.println(sdf.format(d)); // You need format method
哪些产出:

2013-10-25 17:35:14 EDT
有两件事

sdf
Date
的对象,它表示一个特定的时间瞬间(从另一个被称为“历元”的瞬间开始经过的毫秒)。此对象不知道任何格式。该对象的打印方式完全由其类的方法处理,该方法以以下格式打印日期:

dow mon dd hh:mm:ss zzz yyyy
这正是您在输出中看到的。请注意,在这种情况下会打印运行程序的机器的时区。如果您希望以您选择的格式打印此对象,则应使用。要获取特定时区的输出,必须明确地将其告知
DateFormat
对象(见下文)

另一件事是您应该在模式中使用
dd
而不是
dd
D
代表一年中的一天,
D
代表一个月中的一天,我相信这就是你想要的。现在记住这两点,这是解决问题的方法之一:

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("EDT")); // Time Zone for output
Date d = sdf.parse("2013-10-25 17:35:14 EDT");
System.out.println(sdf.format(d)); // You need format method
哪些产出:

2013-10-25 17:35:14 EDT

人们回答的是什么?不了解这里更多的是一个问题:

2013-10-25 17:35:14 EDT != Sat Jan 26 03:05:14 IST 2013

我认为这是因为“EDT”是时区,所以,当英国的EDT是17:35时,英国的EDT是3:05,忽略了夏令时的调整。

这里没有回答的人更多的是问题:

2013-10-25 17:35:14 EDT != Sat Jan 26 03:05:14 IST 2013

我认为这是因为“EDT”是时区,所以,当英国的EDT是17:35时,英国的EDT是3:05,忽略了夏令时调整。

为什么使用javascript标记?它给出了计算机中的时间。我想我不明白这个问题。你期望的输出是什么?我很确定它是那里的
DD
-参见。它应该是
dd
。您得到的是
IST
时间,因为
Date
没有关于
时区的详细信息。它只是从一个时代以来时间的表现。看一看,然后看看这个。为什么是javascript标签?它给了你在计算机中的时间。我想我不明白这个问题。你期望的输出是什么?我很确定它是那里的
DD
-参见。它应该是
dd
。您得到的是
IST
时间,因为
Date
没有关于
时区的详细信息。它只是从一个时代以来时间的表现。请看一看,这是一个很好的例子。