Java,如何取消夏令时?

问题描述 投票:0回答:3

埃及不再有夏令时,我正在服务器中制作一个网络应用程序,并尝试将时间更改为埃及时间,它有效,但是使用夏令时模式,我如何停用它!!

java web-services date servlets dst
3个回答
5
投票

您无法关闭 JVM 中的夏令时。每个时区都使用偏移量以及是否应用夏令时(如果是,则在哪些日期之间)进行编码。

您可以通过以下方式检查:

TimeZone.getDefault().useDaylightTime();
TimeZone.getDefault().inDaylightTime( new Date() );

但是,您可以使用 TZUpdater 工具更新 JDK 安装中的时区文件:

http://www.oracle.com/technetwork/java/javase/downloads/tzupdater-download-513681.html

PS:这是时区文件的修订版,其中引入了埃及的更改。此后又进行了 10 次更新。

版本         引入的 JRE 版本   TzUpdater版本说明

tzdata2011g 1.4.2_33 5.0u31 6u26 7     1.3.39                   埃及今年放弃夏令时的夏令时规则更改。


2
投票

与 Matt 的回答相关,使用 Java 1.6.0_31:

Date now = new Date();

TimeZone zoneEET = TimeZone.getTimeZone("EET"); // Traditionally used for Egypt
System.out.println(zoneEET.getDSTSavings());  // 1h for DST
System.out.println(zoneEET.getRawOffset());  // GMT+2
System.out.println(zoneEET.inDaylightTime(now)); // true
TimeZone.setDefault(zoneEET));
System.out.println(now);
System.out.println("");

TimeZone zoneEgypt = TimeZone.getTimeZone("Egypt"));
System.out.println(zoneEgypt.getDSTSavings()); // no DST
System.out.println(zoneEgypt.getRawOffset()); // GMT+2
System.out.println(zoneEgypt.inDaylightTime(now)); // false
TimeZone.setDefault(zoneEgypt));
System.out.println(now);

看来从1.6.0_26开始有一个名为“埃及”的“特殊”区域,没有夏令时。


0
投票

要“停用”DST,您可以将 GMT 时区配置为默认时区。您可以在 JVM 参数中进行配置

 -Duser.timezone="GMT" 

或通过条件

  TimeZone.setDefault(TimeZone.getTimeZone("GMT"););

这里有一个代码来检查这个解决方案的正确性。 https://www.jdoodle.com/ia/VzO

import java.util.Date;
import java.util.TimeZone;
import java.text.SimpleDateFormat;

public class CheckDSTRemove {
    public static void main(String args[]) {
        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
        core();
    }
    private static void core() {
        boolean isSafe = true;
        for (int year = 1900; year <= 2100; year++) { //Some Years of interest
            for (int month = 1; month <= 12; month++) {
                int maxDay;
                switch (month) {
                case 1: //To run in any JVM
                case 3: 
                case 5: 
                case 7: 
                case 8: 
                case 12: {
                    maxDay = 31;
                    break;
                }
                case 4: 
                case 6: 
                case 9: 
                case 11: {
                    maxDay = 30;
                    break;
                }
                default://Feb
                    maxDay = 28;
                    if(year%4==0 && year%100 != 0 ) { //I've missing the 400 years rule
                        maxDay = 29;
                    }
                }
                for (int dia = 1; dia <= maxDay; dia++) {
                    String s = oldSchoolDayFormat(year, month, dia)+"000000";//To check the border time

                    Date d = toDate(s);
                    java.sql.Timestamp t = new java.sql.Timestamp(d.getTime());
                    String strHour = (t+"").substring(11, 13);
                    if(!"00".equals(strHour)) {// If in the first day of Dayligth saving, this number will be 01
                        System.out.println(s);
                        isSafe = false;
                    }

                }
            }
        }
        if(isSafe) {
            System.out.println("Success!!!");
        }
    }
    /**
     * Old School format that run in any JVM
     * @param year
     * @param month
     * @param day
     * @return
     */
    private static String oldSchoolDayFormat(int year, int month, int day) {
        String strMonth = (month<10?"0"+month:""+month);
        String strDay = (day<10?"0"+day:""+day);
        return year + strMonth + strDay;
    }

    private static Date toDate(String strDate) {
        Date result = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        try {
            result = format.parse(strDate);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.