This question already has answers here:
How to set time zone of a java.util.Date?
                                
                                    (9个答案)
                                
                        
                2年前关闭。
            
        

我正在使用计时器在一定时期内执行某些任务。如果要使任务从该日期开始并在每个期间重复,则此方法需要Date类型。

数小时以来,我一直在努力寻找解决方案,但无济于事。我创建日历并为其设置时区。然后,当我从该日历中获取日期时,该日期包含了我的本地时间。我尝试使用SimpleDataFormat从Date获取字符串,它之所以起作用,是因为您分别为SimpleDataFormat设置了时区。然后甚至尝试将字符串解析为日期,但仍然无法正常工作。我现在有点绝望。如果我无法使用日历,设置日历时区有什么意义?如果不是当地时间,而是UTC,我仍然可以做一些事情。但事实并非如此。我不想让该应用程序基于计算机的本地时间运行。荒谬的是,它应该能够获取本地时间并将其转换为我想要的时区,并像这样使用它。

码:

    TimeZone eu = TimeZone.getTimeZone("GMT+1");
    TimeZone america = TimeZone.getTimeZone("EST");
    TimeZone asia = TimeZone.getTimeZone("GMT+7");
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    df.setTimeZone(eu);
    Calendar euCal = Calendar.getInstance(eu);
    Date dateEu = euCal.getTime();
    System.out.println(dateEu); //Prints local time date
    euCal.setTimeZone(eu);
    System.out.println(dateEu); //Still prints local time date
    String formattedDateEu = df.format(dateEu);
    System.out.println(formattedDateEu); //This one works fine but it is string

    try {
        dateEu = df.parse(formattedDateEu);
    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println(dateEu); //Fun part. Although I don't get exception dateEu is still not in the time zone I want.


样本输出:

Mon Nov 27 14:37:21 MSK 2017
Mon Nov 27 14:37:21 MSK 2017
27/11/2017 12:37:21
Mon Nov 27 14:37:21 MSK 2017

最佳答案

java.util.Date对象不包含时区信息。它们代表时间连续性中的一个时刻,对于每个人而言,这都是相同的时刻,无论他们当时恰好是在巴黎还是在纽约。

但是,当您尝试使用System.out.println()打印Date对象时,它需要尝试对其进行描述。因此,它需要描述其表示的日期和时间,但为此,它首先需要选择一个时区来表示该日期和时间,因为它没有日期和时间。为了方便起见,它选择了用户的系统时区。

您不会通过调用System.out.println()来使用Date,因此您不必关心System.out.println()会做什么。

关于java - 如何在特定时区设置日期? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47510126/

10-15 19:01