Java时区-IST的奇怪行为?
我有以下代码:Java时区-IST的奇怪行为?,java,timezone,Java,Timezone,我有以下代码: DateFormat df = new SimpleDateFormat("M/d/yy h:mm a z"); df.setLenient(false); System.out.println(df.parse("6/29/2012 5:15 PM IST")); 假设我现在将电脑的时区设置为太平洋时间(PDT为UTC-7),则打印 2012年6月29日星期五08:15:00太平洋标准时间 PDT不是比IST(印度标准时间)晚12.5小时吗?这个问题在任何其他时区都不会发生-
DateFormat df = new SimpleDateFormat("M/d/yy h:mm a z");
df.setLenient(false);
System.out.println(df.parse("6/29/2012 5:15 PM IST"));
假设我现在将电脑的时区设置为太平洋时间(PDT为UTC-7),则打印
2012年6月29日星期五08:15:00太平洋标准时间
PDT不是比IST(印度标准时间)晚12.5小时吗?这个问题在任何其他时区都不会发生-我尝试了UTC、PKT、MMT等,而不是日期字符串中的IST。Java中有两个IST吗
注意:实际代码中的日期字符串来自外部源,因此我不能使用GMT偏移量或任何其他时区格式。对不起,我必须为此编写一个答案,但请尝试以下代码:
public class Test {
public static void main(String[] args) throws ParseException {
DF df = new DF("M/d/yy h:mm a z");
String [][] zs = df.getDateFormatSymbols().getZoneStrings();
for( String [] z : zs ) {
System.out.println( Arrays.toString( z ) );
}
}
private static class DF extends SimpleDateFormat {
@Override
public DateFormatSymbols getDateFormatSymbols() {
return super.getDateFormatSymbols();
}
public DF(String pattern) {
super(pattern);
}
}
}
你会发现IST在列表中出现了好几次,第一次确实是以色列标准时间。不是答案,但可以看到下面的输出+代码-似乎
parse
对待IST与TimeZone.getTimeZone(“IST”)
英国夏令时2012年6月29日星期五16:15:002012年6月29日星期五12:45:00英国夏令时
2012年6月29日星期五12:45:00英国夏令时
*BST=伦敦
时区的缩写名称模棱两可,已因时区的奥尔森名称而被弃用。由于parse()和getTimezone()的行为方式可能存在差异,因此以下操作是一致的
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm a Z");
TimeZone istTimeZone = TimeZone.getTimeZone("Asia/Kolkata");
Date d = new Date();
sdf.setTimeZone(istTimeZone);
String strtime = sdf.format(d);
这是因为IST将有多种含义,如爱尔兰标准时间、以色列标准时间、印度标准时间 参考: 使用setTimezone()方法专门设置时区
例如:parser.setTimeZone(TimeZone.getTimeZone(“在这里详细指定时区”) 据我所知,有几位作家。根据时差(9小时)判断,你可能已经得到了以色列标准时间。@biziclop我想了一下。但让我偏离这一点的是以下内容:
System.out.println(TimeZone.getTimeZone(“IST”).getRawOffset())代码>这打印了19800000,或5.5小时,这表明这确实是印度标准时间。或者它是在拾取许多具有相同ID“IST”的时区中的第一个?如果是这样的话,如果某些东西在很多事情上都是相同的,那么它怎么可能是一个“ID”?@esej它更可能是时区缩写中的一个模糊词:看看这个词,它似乎是印度…@Vasan它不是一个真正的ID,SimpleDateFormat
是一个奇怪的野兽,它很可能没有使用timezone.getTimeZone()
没有问题。是的,我就是这么说的SimpleDataFormat
是一种奇怪的野兽,不遵守规则。它有自己的时区数据数组,并使用任何先到的数据。谢谢,这非常有用。我想我必须做一些奇怪的事情,比如在解析日期字符串之前从日期字符串中剥离时区。然后我可以将时区部分传递给timezone.getTimeZone()以获取实际的时区(我想即使这样也不能保证总是有效!)。现在一切都变得支离破碎了,该死的@Vasan DateFormat不是唯一的罪魁祸首,基本问题是时区首字母缩写词不是唯一的。事后看来,这是一个愚蠢的想法
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm a Z");
TimeZone istTimeZone = TimeZone.getTimeZone("Asia/Kolkata");
Date d = new Date();
sdf.setTimeZone(istTimeZone);
String strtime = sdf.format(d);