Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java时区-IST的奇怪行为?_Java_Timezone - Fatal编程技术网

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:00
2012年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);