埃及不再有夏令时,我正在服务器中制作一个网络应用程序,并尝试将时间更改为埃及时间,它有效,但是使用夏令时模式,我如何停用它!!
您无法关闭 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 埃及今年放弃夏令时的夏令时规则更改。
与 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开始有一个名为“埃及”的“特殊”区域,没有夏令时。
要“停用”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;
}
}