`

关于java Date和时区的问题

    博客分类:
  • java
 
阅读更多

java2平台为我们提供了丰富的日期时间API。如java.util.Date;java.util.calendar;java.text.DateFormat等。那么它们之间有什么关系呢?

首先,java.util.Date代表一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数。所以它是没有时区和Locale概念的。java通过如下形式取得当前时间点:

Date now = new Date();  //这个时间点与本地系统的时区无关

而正因为其与时区的无关性,才使得我们的存储数据(时间)是一致的(时区一致性)。一般的我们将now存储于数据库中,当我们需要展现数据时,将now格式化成想要的格式,如:2009-11-19 14:12:23。而这个功能一般交由java.text.DateFormat来实现。例如:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String snow = sdf.format(now);  // 2009-11-19 14:12:23

我们发现snow是带时间(14:12:23)的字符串,我们不禁要问,该时间(14:12:23)是哪个时区的时间?默认情况下,SimpleDateFormat 取得本地系统的时区(我的时区为GMT+8北京),然后按照pattern("yyyy-MM-dd HH:mm:ss")格式化now,此时输出的就是GMT+8区的时间了。如果想支持国际化时间,则先指定时区,然后再格式化date数据。例如:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String snow = sdf.format(now);  // 2009-11-19 14:12:23

另外,你可以通过如下代码修改本地时区信息:

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



java.util.Calendar类也代表时间点,但它为Date的facade工具类,提供了很多对时间点到年、月、日、时、分、秒、星期等的转换(计算)的方便方法。

Calendar calendar = Calendar.getInstance(timezone); 

Date d = calendar.getTime();

Calendar 的计算也是基于时区的,例如:同一个date在不同时区下的小时数是不一样的。但是calendar.getTime();返回的date是没有时区的,因为它是Date类型的。例如:

public static void main(String[] args) throws InterruptedException {
  Calendar calendar1 = Calendar
    .getInstance(TimeZone.getTimeZone("GMT+8"));
  Calendar calendar2 = Calendar
    .getInstance(TimeZone.getTimeZone("GMT+1"));

  System.out.println("Millis = " + calendar1.getTimeInMillis());
  System.out.println("Millis = " + calendar2.getTimeInMillis());

  System.out.println("hour = " + calendar1.get(Calendar.HOUR));
  System.out.println("hour = " + calendar2.get(Calendar.HOUR));

  System.out.println("date = " + calendar1.getTime());
  System.out.println("date = " + calendar2.getTime());
}
输出:

Millis = 1258614681203
Millis = 1258614681203
hour = 3
hour = 8
date = Thu Nov 19 15:11:21 CST 2009
date = Thu Nov 19 15:11:21 CST 2009
分享到:
评论

相关推荐

    Java 之 Date 和 Calendar 实例

    在Java编程语言中,`Date`和`Calendar`类是处理日期和时间的核心组件。这两个类在不同的Java版本中有着不同的使用方式和功能,对于理解Java时间处理机制至关重要。本篇将深入探讨`Date`和`Calendar`类的实例应用。 ...

    java转换时区时间过程详解

    在Java中,我们可以使用java.util.TimeZone和java.util.Date类来实现时区时间转换。下面是一个简单的示例代码: ```java public static Date convertTimezone(Date sourceDate, String targetZoneId) { return ...

    java时区问题

    了解和熟练掌握这些知识点,可以帮助开发者更准确地处理Java中的时区问题,避免因为时区差异导致的错误。在处理跨国或跨地区的应用时,尤其需要注意时区的影响,确保日期时间的正确显示和计算。

    Java_Date_日期时间整理

    可以使用 `java.util.Date` 类的 `toLocaleString()` 方法来输出当前日期,结果将根据本地时区进行格式化。 ```java <%@ page import="java.util.Date"%> <% Date myDate = new Date(); out.println(myDate....

    java中 new date() 打印出的时间与系统时间错了八小时的解决方法

    总的来说,Java中`new Date()` 出现时间差的问题主要源于时区设置,可以通过调整JVM时区或者在代码中设定时区来解决。同时,不要忽视操作系统自身的时区设置,因为它可能会影响到其他非Java程序的时间显示。理解并...

    java操作date对象

    在 Java 中,处理日期和时间主要依赖于 `java.util.Date` 和 `java.text.DateFormat` 这两个核心类。在本文中,我们将深入探讨如何使用这些类来获取、格式化和操作日期。 1. **获取当前时间** 获取当前时间最常用...

    java date

    `java.time.LocalDate.of(year, month, day)`允许你创建指定日期的实例,而`java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME`则是预定义的ISO格式化器,方便快速格式化和解析日期时间。 总的来说,Java 8...

    java Date 处理

    `java.util.Date`类是Java早期用来表示日期和时间的基础类,但它的API设计并不理想,存在一些问题,比如不支持时区转换、线程不安全等。随着Java的发展,`java.time`包中的类如`LocalDate`, `LocalTime`, `...

    JAVA new Date()或Calendar.getInstance().getTime()得到的时间不对

    在Java编程中,`new Date()` 和 `Calendar.getInstance().getTime()` 都是获取当前系统时间的方法,但有时可能会出现获取到的时间与预期不符的情况。这种问题通常与时区设置、系统时间、Java运行环境以及代码逻辑...

    java中Date的格式.pdf

    在Java编程语言中,`java.util.Date` 类用于表示日期和时间。这个类在处理日期相关的操作时非常常见。在给定的文件中,我们看到了三个示例,它们分别展示了如何创建Date对象、格式化日期以及解析日期字符串。 1. **...

    java的Date类型转换成MySQL的DateTime类型.docx

    然而,直接将`java.util.Date`对象写入数据库可能会遇到问题,因为大多数数据库系统包括MySQL,都使用不同的日期/时间格式。 #### MySQL中的DateTime类型 MySQL的`DateTime`类型用于存储日期和时间组合,其格式为`...

    Java时区转换及Date类实现原理解析

    本篇文章主要介绍了Java时区转换及Date类实现原理解析,通过示例代码对Java时区转换和Date类实现原理进行了详细的介绍,对大家的学习或者工作具有一定的参考学习价值。 一、时区的说明 地球表面按经线从东到西,被...

    JAVA Calendar,Date类详解

    在Java编程语言中,`Calendar`和`Date`类是处理日期和时间的核心组件。这两个类在处理日期、时间计算以及格式化等任务时扮演着关键角色。理解并熟练运用它们,对于提升Java开发能力至关重要。 `Date`类是Java早期...

    NextDate(java)

    1. **Java日期时间API**:Java 8引入了新的日期时间API,取代了旧的`java.util.Date`和`java.util.Calendar`。`java.time.LocalDate`是这个新API的一部分,它表示不带时区的日期。要获取当前日期,我们可以使用`...

    java 操作的日期 date

    Java提供了多种方式来处理日期和时间,包括内置的`java.util.Date`类,以及从Java 8开始引入的`java.time`包中的新API。在描述中提到的"my97date"可能是指My97 DatePicker,这是一个流行的Java日期选择控件,常用于...

    mysql时间类型对应的java类型1

    在IT领域,数据库管理和编程语言之间的数据类型对应关系是至关重要的。本文将深入探讨MySQL数据库中的时间类型以及它们在...在实际应用中,还要注意处理时区差异、日期时间格式化以及数据库与Java之间的兼容性问题。

    java 时区转换工具包

    2. 解析指定时间 public static ZonedDateTime parse(String date,String dateFormat,int offset) 3. 获取某一天的零点 public static ZonedDateTime getTodayZonedDayBegin(int offset) 4. 指定某一天的零点 public...

    java-date.zip_java

    - "java date.doc"可能是关于这些概念的详细文档或代码示例,它可能包含了如何创建`Date`对象、如何比较日期和时间、以及如何实现时间段交叉判断的步骤和例子。 总结来说,"java-date.zip_java"这个压缩包文件很...

    java获取系统时间与实际相差8小时的解决方法

    `java.util.Date`是早期Java版本中用于日期和时间操作的类,但它并不包含时区信息。在Java 8及更高版本中,`java.time`包被引入,提供了更强大和易于使用的API,如`LocalDateTime`, `ZonedDateTime`, 和 `ZoneId`等...

    XStream的Date转换 @XStreamConverter DateConverter

    在处理日期时,XStream默认的转换策略可能无法满足所有需求,例如默认格式可能不符合项目规范,或者需要处理时区问题。这时,我们可以自定义一个DateConverter,用`@XStreamConverter`注解标记,以替换默认的转换器...

Global site tag (gtag.js) - Google Analytics