我正在尝试将EST时区打印出的日期转换为GMT/UTC打印出的日期
package com.stefano;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class MainEntry {
/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
String dateTime = "1307011200"; //12:00PM 01 July 2013
System.out.println("Input -> " + dateTime);
SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmm");
format.setTimeZone(TimeZone.getTimeZone("EST"));
Date date = format.parse(dateTime);
System.out.println("Intermediate -> " + date);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("Output -> " + format.format(date));
}
}
它给出的输出是:
Input -> 1307011200
Intermediate -> Mon Jul 01 17:00:00 BST 2013
Output -> 1307011600
尽管EST和GMT之间的时差总是5,但它不知何故与BST有关。
我不能使用Joda-Time。
SimpleDateFormat.parse(String)方法的javadoc引用parse(String, ParsePosition)方法,该方法表示:
此解析操作使用日历生成Date。因此,日历的日期-时间字段和TimeZone值可能已经被覆盖,这取决于子类的实现。任何先前通过调用setTimeZone设置的TimeZone值可能需要恢复以进行进一步操作。
根据这个,你不能使用这个方法来告诉SimpleDateFormat是哪个时区给定的日期已输入。你可以这样修改这个方法:
String dateTime = "1307011200"; // 12:00PM 01 July 2013
dateTime += " EST"; // append the timezone information to the input string
System.out.println("Input -> " + dateTime);
SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmm z"); // tell the formatter to look for the timezone info
Date date = format.parse(dateTime);
System.out.println("Intermediate -> " + date);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("Output -> " + format.format(date));
这也将使用您的本地时区打印Date对象,但它展示了使用给定时区解析dateTime字符串的方法。
zovits的答案是正确的。
美国东海岸偏移量
如果你说的EST
是指美国东海岸(和加拿大部分地区),那么你的表述the time difference between EST and GMT is always 5
是不正确的。对于夏令时(DST),偏移量可以是-05:00 或 -04:00。事实上,您指定的日期时间确实有夏令时生效。
避免使用3-4个字母的时区代码
那些三个或四个字母的时区代码既不标准化也不唯一。避免它们。使用合适的时区名称,大多数是大陆+城市。
与Joda-Time的比较
为了进行比较,下面是一些jdbc - time示例代码。java.util.Date &与Java捆绑在一起的日历类是出了名的麻烦,每个Java程序员都应该转向Joda-Time或新的Java 8 Java。time包(灵感来自JSR 310定义的Joda-Time)。虽然java.util.Date似乎有一个时区,但实际上没有,请注意,Joda-Time DateTime确实知道它自己分配的时区。
Joda-Time使用ISO 8601标准作为默认值。您也可以使用其他格式,如下面的montrsamal示例所示。
示例代码String input = "1307011200"; //12:00PM 01 July 2013
DateTimeFormatter formatterSmooshed = DateTimeFormat.forPattern( "yyMMddHHmm" );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime dateTimeNewYork = formatterSmooshed.withZone( timeZoneNewYork ).parseDateTime( input );
DateTime dateTimeUtc = dateTimeNewYork.withZone( DateTimeZone.UTC );
String outputMontréal = DateTimeFormat.forStyle( "FF" ).withLocale( Locale.CANADA_FRENCH ).print( dateTimeNewYork );
String outputSmooshed = formatterSmooshed.print( dateTimeNewYork ); // Expect same as input.
转储到控制台…
System.out.println( "input: " + input );
System.out.println( "dateTimeNewYork: " + dateTimeNewYork );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "outputMontréal: " + outputMontréal );
System.out.println( "outputSmooshed: " + outputSmooshed );
运行时……
input: 1307011200
dateTimeNewYork: 2013-07-01T12:00:00.000-04:00
dateTimeUtc: 2013-07-01T16:00:00.000Z
outputMontréal: lundi 1 juillet 2013 12 h 00 EDT
outputSmooshed: 1307011200