Đoạn mã sau xuất hiện để chứng minh một lỗi trong java.util.Date theo đó một giờ được thêm vào nếu đồng hồ cục bộ được đặt thành GMT với điều chỉnh DST và thời gian trước ngày 1 tháng 11 năm 1971. Giả định đầu tiên của tôi luôn là tôi đã sai rồi. Bất cứ ai có thể nhìn thấy những gì sai (hoặc đây thực sự là một lỗi Java)? Điều gì quan trọng vào ngày 1 tháng 11 năm 1971?Tại sao một giờ được thêm vào java.util.Date cho các ngày trước ngày 1 tháng 11 năm 1971?
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
class JavaUtilDateBug
{
private static void demo() throws Exception
{
// UK developers usually have the clock on their development machines set
// to "Europe/London" (i.e. GMT with daylight saving). Set it explicitly
// here so readers in other countries can see the problem too.
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
Locale.setDefault(Locale.ENGLISH);
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
String strJan1st1970Expected = "Thu Jan 01 00:00:00 GMT 1970";
String strJan1st1970Actual = dateFormat.parse(strJan1st1970Expected).toString();
System.out.println("strJan1st1970Actual: " + strJan1st1970Actual); // -> "Thu Jan 01 01:00:00 GMT 1970"
boolean jvmHasDateBug = !strJan1st1970Expected.equals(strJan1st1970Actual);
System.out.println("jvmHasDateBug: " + jvmHasDateBug); // -> true
// The anomaly only seems to affect times before 1 Nov 1971.
final String strNov1st1971 = "Mon Nov 01 00:00:00 GMT 1971";
assert strNov1st1971.equals(dateFormat.parse(strNov1st1971).toString());
}
public static void main(String[] args)
{
try
{
demo();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
My Java môi trường:
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)
Chương trình demo của bạn chỉ hoạt động trên các máy không phải tiếng Anh nếu bạn cũng đặt ngôn ngữ địa phương (phân tích ngày không thành công). –
Cảm ơn, Michael. Đã cập nhật mã demo. –