`
tuhaitao
  • 浏览: 378741 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java永远的伤-中国1927年12月31日午夜

    博客分类:
  • java
 
阅读更多

 

 

        话说在中国1927年12月31日午夜发生了一件神奇的事情,中国时间瞬间增加了5分52秒,

 

不管你信不信,反正我信了!不信你看下边代码!

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core;

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

/**
 * Java Date Test
 * @author opencfg.com
 * @since 0.0.1-SNAPSHOT
 * @version 0.0.1-SNAPSHOT
 * @date 2011-8-15
 */
public class JavaDateTest {

	public static void main(String[] args) throws ParseException {
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date1 = sf.parse("1927-12-31 23:54:06");
		Date date2 = sf.parse("1927-12-31 23:54:07");
		Date date3 = sf.parse("1927-12-31 23:54:08");
		Date date4 = sf.parse("1927-12-31 23:54:09");
		System.out.println(date2.getTime() - date1.getTime());
		System.out.println(date3.getTime() - date2.getTime());
		System.out.println(date4.getTime() - date3.getTime());
	}
	
}
 

输入结果是:

 

1000
353000
1000

 

 

5分52秒 = 5 * 60 + 53 = 352  ,在加上本来就多的1秒,结果是多了353秒

 

java傻了吗?硬件有问题吗?都错

 

是政治问题,不信你看这里:

 

java永远的伤

附地址:http://www.timeanddate.com/worldclock/clockchange.html?n=237&year=1927

 

历史确实有记载,简单地说,在1927年末的最后那一个午夜,时钟被往回拨了5分52秒。所以“1927-12-31 23:54:08”这一秒,事实上,发生了两次,而看起来在计算当地时间时,Java将其视为了后面那一个时间点,于是就产生了这一差别。

 

下边是摘抄一iteye哥们的:

 

时间区域和JAVA 
    涉及有关时间区域信息时Java和Solaris很相似。每个时间区域都有一个时间区域ID标识符。在J2SE 1.3 and 1.4中,这个ID是个字符串,是由位于J2SE 安装程序的jre/lib子目录中的tzmappings文件这些ID列表。 J2SE 1.3 仅仅只包含tzmappings文件,但是 J2SE 1.4包含世界不同地区的时间区域数据文件。jre/lib/zi存放着这些文件。在J2SE 1.4里,sun.util.calendar.ZoneInfo从这些文件获取DST规则。在Solaris中, 这些时间区域数据文件是以二进制形式存放的,不是文本文件,因此你不能看它们。 在J2SE 1.4中的时间区域数据文件和在Solaris中是不同的。 

     java.util.TimeZone类中getDefault方法的源代码显示,它最终是会调用sun.util.calendar.ZoneInfo类的getTimeZone 方法。这个方法为需要的时间区域返回一个作为ID的String参数。这个默认的时间区域ID是从 user.timezone (system)属性那里得到。如果user.timezone没有定义,它就会尝试从user.country和java.home (System)属性来得到ID。 如果它没有成功找到一个时间区域ID,它就会使用一个"fallback" 的GMT值。换句话说, 如果它没有计算出你的时间区域ID,它将使用GMT作为你默认的时间区域。 

注意,System属性是在java.lang.System类的initProperties方法中被初始化的。这是一个本地方法。因此源代码是不可用的----除非你深入到J2SE分发包中的本地代码库中去研究。然而,在Windows系统中,System 属性是从Windows注册表中被初始化的,而在Linux/Unix中是由环境变量来进行初始化。initProperties方法的Javadoc声明,某些属性"必须保证被定义" 且列出它们。被java.util.TimeZone类的getDefault方法使用的三个System属性中,只有java.home作为一种“保证的”属性在Javadoc中被列出。 

推荐的解决方案 
     因此,你如何确保JAVA能给你正确的时间和日期呢?最好的办法是确认JAVA虚拟机(JVM)的默认TimeZone类是正确的,且是适合你的地理范围(Locale)的。你如何来确保默认TimeZone是正确的且适合的呢?这又是一个新问题了。象大多数处理的问题一样,这个也有许多解决方案。根据java.util.TimeZone.getDefault方法的源代码来看,最好的办法是正确地设置user.timezone属性。在启动JAVA虚拟机时,你能很容易的通过使用 -D 命令 -line 参数的办法来覆盖(override)在java.lang.System.initProperties方法中所设置的值。例如: 

Java代码 
  1. java -Duser.timezone=Asia/Shanghai DateTest  


这个命令启动DateTest类,并设置 user.timezone属性到Asia/Shanghai。你也能够通过使用java.lang.System 类的setProperty方法来设置user.timezone 属性:

Java代码 
  1. System.setProperty("user.timezone","Asia/Shanghai");  

 

如果没有一个可用的时间区域ID适合你,那么就你可以创建一个自定义TimeZone 使用java.util.TimeZone 类的 setDefault 方法将它设置为默认的时间区域----就象我先前在ItsInitializer 类中所做的操作一样。 

记住,在J2SE中,大多数日期和时间相关的类都包含时间区域信息,包括那些格式类,如java.text.DateFormat, 因此它们都会被JVM的默认时间区域所影响。然而,在你创建这些类的实例时,你能为它们确保正确的时间区域信息,使得你可以更容易来设置整个JVM的默认时间区域。并且一旦设置好,就可以确保所有的这些类都将使用同一个默认的时间区域。 

 

 

看到最后你是否发现,中国时间都信不过了,悲催哇,洗洗看电影睡吧!CCTV的报时也不一定是准的哇,靠人不如靠自己, 于是 就产生了 我靠!

 

 

分享到:
评论

相关推荐

    15.(地图数据篇)百度午夜蓝地图瓦片数据爬取--java代码.zip

    在本项目中,我们主要探讨的是如何使用Java编程语言来爬取百度地图的“午夜蓝”风格的地图瓦片数据。这个过程涉及到网络爬虫技术、地图坐标系统、以及图像处理等多个IT领域的知识点。 首先,我们需要理解“地图瓦片...

    java--时间戳与时间转换工具

    时间戳通常表示自1970年1月1日(UTC/GMT的午夜)以来的毫秒数。下面将详细讨论如何在Java中进行时间戳与时间的相互转换,以及如何利用提供的源码创建一个简单的转换工具。 1. **时间戳到日期转换**: Java中可以...

    Java 实例 - 获取文件修改时间源代码-详细教程.rar

    `File`类提供了一个名为`lastModified()`的方法,该方法返回文件的最后修改时间,以毫秒为单位自1970年1月1日(午夜UTC/GMT)以来的持续时间。例如: ```java File file = new File("path_to_your_file"); long ...

    午夜桌球3.SISX

    午夜桌球3.SISX NOKIA手机软件

    Java 实例 - 时间戳转换成时间源代码-详细教程.zip

    在Java编程中,时间戳(Timestamp)是一种表示特定时间的数字,它通常以自1970年1月1日(UTC/GMT的午夜)开始所经过的毫秒数来表示。本教程将深入探讨如何在Java中将时间戳转换为可读的时间格式,并提供详细的源代码...

    认识年月日知识点.pdf

    1. 一年有12个月,其中大月有31天,包括1月、3月、5月、7月、8月、10月和12月,共7个月。小月有30天,包括4月、6月、9月和11月,共4个月。特殊的是2月,平年有28天,闰年有29天。 2. 关于闰年的判断:通常每4年有一...

    XBS午夜剧场开关,自动切换

    在IT行业中,XBS午夜剧场开关是一款专为网吧设计的自动化播放系统,它主要用于在特定时间自动切换到预设的影视内容,特别是在深夜时段,为顾客提供不间断的娱乐体验。这一工具对于网吧业主来说非常实用,因为它可以...

    午夜商店.apk.1

    午夜商店.apk.1

    2.(地图数据篇)百度地图瓦片数据爬取--java代码.zip

    在本项目中,我们主要探讨的是如何利用Java代码实现对百度地图瓦片数据的爬取。这个过程涉及到网络请求、地图坐标系统转换以及图像处理等多个技术领域。首先,我们需要了解地图瓦片的基本概念。 地图瓦片是将大地图...

    Java Date Time 教程-时间测量.docx

    `System.currentTimeMillis()`函数是Java提供的一个基础时间测量工具,它返回自1970年1月1日午夜(UTC)以来的毫秒数。然而,这个方法并不提供微秒级别的精度,因此在连续多次调用之间可能会存在不精确性。为了获得...

    java.sql.date与java.util.date.pdf

    `java.util.Date` 是一个广泛使用的类,它可以表示从1970年1月1日(UTC)午夜开始到现在的毫秒数。这个类提供了许多方法来获取和设置日期和时间,并且通常用于日常的日期时间处理,如格式化、比较和计算等。它的格式...

    java-oracle数据库时间问题.docx

    Java与Oracle数据库日期格式处理 Java中的日期格式处理: Java中的日期格式处理主要通过使用SimpleDateFormat类来实现。SimpleDateFormat类可以将日期对象转换为指定的日期字符串格式。例如,下面的代码将日期对象...

    java游戏很黄很暴力

    java游戏

    java-oracle数据库时间问题.pdf

    Java 与 Oracle 中的日期时间格式处理 Java 中的日期时间格式处理: Java 的日期时间格式处理可以通过使用 `SimpleDateFormat` 类来实现。`SimpleDateFormat` 类允许我们自定义日期时间的格式,并将其格式化为字符...

    上海java笔试题目-project-social-network-analysis:Lehigh课程Java、算法和计算机科学基础的期末项目

    日星期日午夜。 评估将基于 50% 的问题的答案和 50% 的编码风格和策略。 特别是样式必须通过等级检查(等级→验证→检查)。 我们不提供答案测试,因此您必须依靠常识来评估您的答案。 数据 数据由位于上海的UTSEUS...

    同花顺java面试笔试题-questions:问题

    日午夜以来经过的秒数,并打印出确切的月、日和年。 你得到了一个已经实现的“isLeapYear”函数。 您不能使用内置的日期/时间函数。 微软曾经制造过一种名为 Zune 的便携式 MP3 播放器。 Zune 有一个前置 LED 显示屏...

    java四种时间的区别和联系

    `java.sql.Date`专门用于数据库交互,它继承自`java.util.Date`,但是去除了时间部分,只保留了日期部分(年、月、日)。这意味着`java.sql.Date`对象总是表示一天中的午夜时刻(00:00:00),这使得它非常适合存储在...

    java_时间戳与Date_相互转化相关函数.txt

    时间戳通常表示为从1970年1月1日午夜(UTC时间)到指定时刻之间的时间间隔,单位通常是毫秒。而`Date`类则是Java中用于表示特定瞬间或时间点的类。下面将详细介绍如何在这两者之间进行转换,以及相关的函数和方法。 ...

    poi-ooxml-schemas-3.9.jar

    Apache POI是一个流行的开源Java库,它允许开发者读写Microsoft Office格式的文件,如Word(DOCX)、Excel(XLSX)和PowerPoint(PPTX)。OOXML是这些文件的新标准格式,以XML为基础,提供了更丰富的文档结构和数据...

Global site tag (gtag.js) - Google Analytics