当前位置: 首页 > 知识库问答 >
问题:

Java时区-IST的奇怪行为?

陶刚豪
2023-03-14

我有以下代码:

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偏移量或任何其他时区格式

共有3个答案

陆英毅
2023-03-14

不是答案,但请参见下面的输出代码-似乎parse对待IST的方式与时区有所不同。getTimeZone(“IST”)。。。

Fri Jun29 16:15:00BST 2012
Fri Jun29 12:45:00BST 2012
Fri Jun29 12:45:00BST 2012
*BST=London

public static void main(String[] args) throws InterruptedException, ParseException {
    DateFormat fmt1 = new SimpleDateFormat("M/d/yy h:mm a Z");
    Date date = fmt1.parse("6/29/2012 5:15 PM IST");
    System.out.println(date);

    DateFormat fmt2 = new SimpleDateFormat("M/d/yy h:mm a");
    fmt2.setTimeZone(TimeZone.getTimeZone("IST"));
    System.out.println(fmt2.parse("6/29/2012 5:15 PM"));

    DateFormat fmt3 = new SimpleDateFormat("M/d/yy h:mm a");
    fmt3.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
    System.out.println(fmt3.parse("6/29/2012 5:15 PM"));
}
郎鸿
2023-03-14

对不起,我必须为此写一个答案,但是试试这个代码:

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在列表中出现了好几次,第一次确实是以色列标准时间。

宓茂才
2023-03-14

时区的缩略名称含糊不清,已被弃用为时区的Olson名称。下面的工作方式是一致的,因为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);
 类似资料:
  • 问题内容: 我有以下代码: 假设我现在将PC的时区设置为太平洋时间(PDT为UTC-7),则打印 2012年6月29日,星期五,星期五:08:15:00 PDT是否比IST(印度标准时间)晚12.5小时?对于任何其他时区都不会发生此问题- 我在日期字符串中尝试使用UTC,PKT,MMT等代替IST。Java中是否有两个IST? PS:实际代码中的日期字符串来自外部来源,因此我不能使用GMT偏移量或

  • 我在使用Java8中的LocalDateTime时有点困惑。 null 有人能解释一下我的这种行为吗?这是意料之中的还是我做错了什么(或者我没有理解一些明显的事情:))?提前谢谢你帮助我。 编辑: 这个问题与相当古老的年份(1889)有关,但它是Excel中用于时间表示的年份。查看问题的代码示例:http://ideone.com/kahaaz

  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

  • 我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还

  • 我发现了Java并发的奇怪行为。请参阅下面的下一段代码: 在我看来,这段代码应该挂起并永远等待,但是在控制台中的next out没有任何问题地完成了代码: 我试图找到一些关于如果线程死了通知锁的信息,但缺乏。我也没有在Java规范中找到任何信息。 但是如果我试图锁定其他对象(而不是thread对象),就会像我预期的那样工作得很好。

  • 如果有人理解java编译器为什么这么做,请解释一下。