当前位置: 代码迷 >> 综合 >> java.util工具类之Date、Calendar、GregorianCalendar、TimeZone、SimpleTimeZone、Locale
  详细解决方案

java.util工具类之Date、Calendar、GregorianCalendar、TimeZone、SimpleTimeZone、Locale

热度:116   发布时间:2023-10-19 00:13:36.0

JDK8在线Api中文手册

JDK8在线Api英文手册

java.util工具类之Date、Calendar、GregorianCalendar、TimeZone、SimpleTimeZone、Locale

          • Date 类
          • Calendar 类
          • GregorianCalendar 类
          • TimeZone 类
          • SimpleTimeZone 类
          • Locale 类

Date 类

   Date类封装了当前日期和时间。与Java1.0定义的原始版Date类相比,Date类发生了本质性的变化。在Java1.1发布时,原始版Date类定义的许多功能被移进Calendar和DateFormat类类中。因此,Java1.0中原始版Date类中的许多方法已经不赞成使用。对于新代码,不应当使用已不赞成使用的Java1.0版方法,在此不介绍这些方法。
   Date类支持以下构造函数:

Date()
Date(long millisec)

   第1个构造函数使用当前日期和时间初始化对象。第2个构造函数接受一个参数,该参数等于自1970年1月1日午夜以来经历的毫秒数。表1显示了Date类定义的那些仍然赞成使用的方法。Date类还实现了Comparable接口。

表1 Date类定义的仍然赞成使用的方法
方 法 描 述
boolean after(Date date) 如果调用Date对象中包含的日期比date指定的日期晚,就返回true;否则返回false
boolean before(Date date) 如果调用Date对象中包含的日期比date指定的日期早,就返回true;否则返回false
Object clone() 复制调用Date对象
int compareTo(Date date) 比较调用对象中包含的日期与date指定的日期。如果两者相同,就返回0;如果调用对象早于date,就返回一个负值;如果调用对象晚于date,就返回一个正直
boolean equals(Object date) 如果调用Date对象中包含的日期和时间与date指定的日期和时间相同,就返回true;否则返回false
static Date from(Instant t) 返回与t中传递的Instant对象对应的Date对象(JDK8新增)
long getTime() 返回自1970年1月1日午夜开始已经经历的毫秒数
int hashCode() 返回调用对象的散列码
void setTime(long time) 将日期和时间设置为time指定的值,time是自1970年1月1日午夜开始已经经历的毫秒数
Instant toInstant() 返回与调用Date对象对应的Instant对象(JDK8新增)
String toString() 将调用Date对象转换成字符串并返回结果

   通过检查表1可以看出,仍然赞成使用的Date特性不允许获取日期或时间的单个组成部分。正如下面的程序锁演示的,只能以毫秒为单位获取日期和时间,或者通过toString()方法返回日期和时间的默认字符串表示形式,或者(从JDK8开始)作为Instant对象来获取日期和时间,为了获取关于日期和时间的更详细信息,需要使用Calendar类。

//Show date and time using only Date methods.
import java.util.Date;
class DateDemo {
    public static void main(String[] args) {
    //Instantiate a Date objectDate date = new Date();//display time and date using toString()System.out.println(date);//Display number of milliseconds since midnight,January 1,1970 GMTlong msec = date.getTime();System.out.println("Milliseconds since Jan. 1,1970 GMT = "+msec);/*** 输出:* Sat Feb 08 15:23:47 CST 2020* Milliseconds since Jan. 1,1970 GMT = 1581146627936*/}
}
Calendar 类

   Calendar抽象类提供了一套方法,允许将毫秒形式的时间转换成大量有用的时间组成部分,可以提供的这类信息的一些例子有年、月、日、小时、分和秒。Calendar的子类将提供根据它们自己的规则解释时间信息的功能。这是Java类库使我们能够编写在国际化环境中运行的程序的一个方面。这种子类的一个GregorainCalendar。
   注意
   JDK8在java.time中定义了新的日期和时间API。
   Calendar类没有提供公有的构造函数。Calendar类定义了几个受保护的实例变量。areFieldsSet是布尔型变量,指示是否设置了时间组成部分。fields是int型数组,用来保存时间组成部分。isSet是布尔型数组,指示是否设置了特定的时间组成部分。time是长整型变量,用来保存这个对象的当前时间。isTimeSet是布尔型变量,指示了是否设置了当前时间。

表2 Calendar类定义的常用方法
方 法 描 述
abstract void add(int which,int val) 将val添加到由which指定的时间或日期组成部分中。如果要进行减法操作,可以添加一个负值。which必须是Calendar类定义的域变量之一,如Calendar.HOUR
boolean after(Object calendarObj) 如果调用Calendar对象中包含比calendarObj指定的日期晚,就返回true;否则返回false
boolean before(Object calendarObj) 如果调用Calendar对象中包含的日期比calendarObj指定的日期早,就返回true;否则返回false
final void clear() 将调用对象中包含的所有时间组成部分清零
final void clear(int which) 将调用对象中包含的由which指定的时间组成部分清零
Object clone() 返回调用对象的一个副本
boolean equals(Object clendarObj) 如果调用Calendar对象包含的日期与calendarObj指定的日期相同,返回true;否则返回false
int get(int calendarField) 返回调用对象中某个时间组成部分的值,这个组成部分由calendarField指定。可以返回的组成部分包括Calendar.YEAR、Calendar.MONTH、Calendar.MINUTE等
static Locale[] getAvailableLocales() 返回一个由Locale对象组成的数组,其中包含可以使用日历的地区信息
static Calendar getInstance() 为默认地区和时区返回Calendar对象
static Calendar getInstance(TimeZone tz) 为tz指定的时区返回Calendar对象。使用默认地区
static Calendar getInstance(Locale locale) 为locale指定的地区返回Calendar对象。使用默认时区
static Calendar getInstance(TimeZone tz,Locale locale) 为tz指定的时区和locale指定的地区返回Calendar对象
final Date getTime() 返回与调用对象的时间相同的Date对象
TimeZone getTimeZone() 返回调用对象的时区
final boolean isSet(int which) 如果设置了指定的时间组成部分,就返回true;否则返回false
void set(int which,int val) 在调用对象中,将which指定的日期或时间部分设置为由val指定的值。which必须是Calendar定义的域变量之一,如Calendar.HOUR
final void set(int year,int month,int dayOfMonth) 设置调用对象的各种日期和时间组成部分
final void set(int year,int month,int dayOfMonth,int hours,int minutes) 设置调用对象的各种日期和时间组成部分
final void set(int year,int month,int dayOfMonth,int hours,int minutes,int seconds) 设置调用对象的各种日期和时间组成部分
final void setTime(Date d) 设置调用对象的各种日期和时间组成部分。信息是从Date对象d中获取的
void setTimeZone(TimeZone tz) 将调用对象的时区设置为tz指定的时区
final Instant toInstant() 返回与调用Calendar实例对应的Instant对象(JDK8新增)

   Calendar类定义了以下int型常量,当获取或设置日历的组成部分时,需要用到这些常量,带有FOTMAT和STANDALONE后缀的都是JDK8新增的常量:

ALL_STYLES HOUR_OF_DAY PM
AM JANUARY SATURDAY
AM_PM JULY SECOND
APRIL JUNE SEPTEMBER
AUGUST LONG SHORT
DATE LONG_FORMAT SHORT_FORMAT
DAY_OF_MONTH LONG_STANDALONE SHORT_STANDALONE
DAY_OF_WEEK MARCH SUNDAY
DAY_OF_WEEK_IN_MONTH MAY THURSDAY
DAY_OF_YEAR MILLISECOND TUESDAY
DECEMEBER MINUTE UNDECIMBER
DST_OFFSET MONDAY WEDNESDAY
ERA MONTH WEEK_OF_MONTH
FEBRUARY NARROW_FORMAT WEEK_OF_YEAR
FIELD_COUNT NARROW_STANDALONE YEAR
FRIDAY NOVEMBER ZONE_OFFSET
HOUR OCTOBER

   下面的程序演示了Calendar类的一些方法:

//Demonstrate Calendar
import java.util.Calendar;
class CalendarDemo {
    
public static void main(String[] args) {
    String months[]={
    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};//Create a calendar initialized with the//current date and time int the default//locale and timezone.Calendar calendar = Calendar.getInstance();//Display current and date information.System.out.print("Date: ");System.out.print(months[calendar.get(Calendar.MONTH)]);System.out.print(" "+calendar.get(Calendar.DATE)+" ");System.out.println(calendar.get(Calendar.YEAR));System.out.print("Time: ");System.out.print(calendar.get(Calendar.HOUR)+":");System.out.print(calendar.get(Calendar.MINUTE)+":");System.out.println(calendar.get(Calendar.SECOND));//Set the time and date information and display it.calendar.set(Calendar.HOUR,20);calendar.set(Calendar.MINUTE,20);calendar.set(calendar.SECOND,20);System.out.print("Updated time: ");System.out.print(calendar.get(Calendar.HOUR)+":");System.out.print(calendar.get(Calendar.MINUTE)+":");System.out.println(calendar.get(Calendar.SECOND));/*** 输出:* Date: Feb 8 2020* Time: 4:47:17* Updated time: 8:20:20*/}
}
GregorianCalendar 类

   GregorainCalendar类是Calendar类的具体实现,实现了Gregorain日历。Calendar类的getInstance()方法通常会返回一个GregorainCalendar对象,这个对象使用默认地区和时区下的当前日期和时间进行初始化。
   GregorainCalendar定义了两个域变量:AD和BC。它们表示格林尼治日历定义的两个纪元。
   GregorainCalendar对象还有几个构造函数。默认构造函数GregorainCalendar()使用默认地区和时区下的当前日期和时间进行初始化。还有以下3个构造函数可以指定其他信息:

GregorainCalendar(int year,int month,int dayOfMonth)
GregorainCalendar(int year,int month,int dayOfMonth,int hours,int minutes)
GregorainCalendar(int year,int month,int dayOfMonth,int hours,int minutes,int seconds)

   所有这3个版本都设置年、月和日。其中,year指定了年。月是由month指定的,0表示1月。月份中的日期是由dayofMonth指定的。第1个版本中奖时间设置为午夜,第2个版本中还设置了小时和分钟,第3个版本添加了秒。
   可以通过指定地区和/或时区来构造GregorainCalendar对象。使用如下构造函数创建的对象,将使用指定时区和/或地区下的当前时间进行初始化:

GregorainCalendar(Locale locale)
GregorainCalendar(TimeZone timeZone)
GregorainCalendar(TimeZone timeZone,Locale locale)

   GregorainCalendar实现了Calendar中的所有抽象方法,另外还提供了一些附加方法,如isLeapYear(),该方法测试某年是否是闰年,形式如下:

boolean isLeapYear(int year)

   如果year是闰年,该方法就返回true;否则返回false。JDK8还添加了以下方法:fro()和toZoneDateTime(),用于支持新的日期和时间API;getCalendarType(),它将日历类型作为一个字符串返回,即"gregory"。
   下面的程序演示了GregorainCalendar类:

//Demonstrate GregorianCalendar类:
import java.util.Calendar;
import java.util.GregorianCalendar;
class GregorianCalendarDemo {
    public static void main(String[] args) {
    String months[]={
    "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};int year;//Create a Gregorian calendar initialized//with the current date and time in the//default locale and timezone.GregorianCalendar gcalendar = new GregorianCalendar();//Display current time anf date information.System.out.print("Date: ");System.out.print(months[gcalendar.get(Calendar.MONTH)]);System.out.print(" "+gcalendar.get(Calendar.DATE)+" ");System.out.println(year=gcalendar.get(Calendar.YEAR));System.out.print("Time: ");System.out.print(gcalendar.get(Calendar.HOUR)+":");System.out.print(gcalendar.get(Calendar.MINUTE)+":");System.out.println(gcalendar.get(Calendar.SECOND));//Test if the current year is a leap yearif(gcalendar.isLeapYear(year)){
    System.out.println("The current year is a leap year");}else{
    System.out.println("The current year is not a leap year");}/*** 输出:* Date: Feb 8 2020* Time: 5:23:12* The current year is a leap year*/}
}
TimeZone 类

   另外一个与时间相关的类是TimeZone。TimeZone抽象类可以处理与格林尼治标准时间(Greenwich Mean Time,GMT)——也就是世界时间(Universal Time Coordinated,UTC)之间的时差。另外还能够计算夏令时。TimeZone只支持一个默认构造函数。

表3 TimeZone类定义的一些方法
方 法 描 述
Object clone() 返回特定于TimeZone的clone版本
static String[] getAvailableDs() 返回一个表示所有时区名称的String对象数组
static String[] getAvailableIDs(int timeDelta) 返回一个String对象数组,表示与GMT时差为timeDelta的所有时区名称
static TimeZone getDefault() 返回一个表示宿主计算机默认时区的TimeZone对象
String getID() 返回调用TimeZone对象的名称
abstract int getOffset(int era,int year,int month,int dayOfMonth,int dayOfWeek,int millisec) 返回计算当地时间时需要添加到GMT的时差,这个值会针对夏令时进行调整,该方法的参数表示日期和时间的组成部分
abstract int getRawOffset() 返回计算当地时间时需要添加到GMT的原始时差(使用毫秒表示),这个值不会针对夏令时进行调整
static TimeZone getTimeZone(String tzName) 为名为tzName的时区返回TimeZone对象
abstract boolean inDaylightTime(Date d) 如果日期d在调用对象的夏令时范围之内,就返回true;否则返回false
static void setDefault(TimeZone tz) 设置当前主机使用的默认时区,tz是将要使用的TimeZone对象的引用
void setID(String tzName) 将时区的名称(即时区的ID)设置为tzName指定的名称
abstract void setRawOffset(int millis) 以毫秒为单位设置与GMT之间的时差
ZoneId toZoneId() 将调用对象转换为ZoneId,并返回结果。ZoneId定义在java.time包中(JDK8新增)
abstract boolean useDaylightTime() 如果调用对象使用夏令时,就返回true;否则返回false
SimpleTimeZone 类

   SimpleTimeZone类是TimeZone的一个便利子类。它实现了TimeZone的抽象方法,并且可以操作Gregorian日历的时区,此外还能够计算夏令时。
   SimpleTimeZone类定义了4个构造函数,其中一个如下:

SimpleTimeZone(int timeDelta,String tzName)

   这个构造函数创建一个SimpleTimeZone对象,这个对象相对于格林尼治标准时间(GMT)的时差是timeDelta,时区名称为tzName。
   第2个SimpleTimeZone构造函数如下:

SimpleTimeZone(int timeDelta,String tzId,int dstMonth0,int dstDayInMonth0,int dstDay0,int time0,int dstMonth1,int dstDayInMonth1,int dstDay1,int time1)

   其中,相对于GMT的时差是由timeDelta指定的。时区名称是由tzID传入的。夏令时的开始时间是由参数dstMonth0,dstDayInMonth0,dstDay0和time0指定的。夏令时的结束时间是由参数dstMonth1、dstDayInMonth1、dstDay1和time1指定的。
   第3个SimpleTimeZone构造函数如下:

SimpleTimeZone(int timeDelta,String tzId,int dstMonth0,int dstDayInMonth0,int dstDay0,int time0,int dstMonth1,int dstDayInMonth1,int dstDay1,int time1,int dstDelta)

   其中,dstDelta是夏令时期间节约的毫秒数。
   第4个SimpleTimeZone构造函数如下:

SimpleTimeZone(int timeDelta,String tzId,int dstMonth0,int dstDayInMonth0,int dstDay0,int time0,int time0mode,int dstMonth1,int dstDayInMonth1,int dstDay1,int time1,int time1mode,int dstDelta)

   其中,time0mode指定了开始时间的模式,time1mode指定了结束时间的模式。有效的模式值包括:STANDARD_TIME、WALL_TIME、UTC_TIME
   时间模式指示如何解释时间。其他构造函数默认模式WALL_TIME。

Locale 类

   使用Locale类实例化的对象,用于描述地理或文化上的区域。Locale类是为数不多的几个类之一,使用这几个类可以编写能够在不同国际化环境中运行的Java程序。例如在不同的区域,用于显示日期、时间和数字的格式是不同的。
   国际化是一个很大的主题。但是,许多程序只需要处理基本问题,包括设置当前地区。
   Locale类定义了以下常量,对于应对大部分常见地区来说,这些常量是有用的:

CANADA GERMAN KOREAN
CANADA_FRENCH GERMANY PRC
CHINA ITALIAN SIMPLIFIED_CHINESE
CHINESE ITALY TAIWAN
ENGLISH JAPAN TRADITIONAL_CHINESE
FRANCE JAPANESE UK
FRENCH KOREA US

   例如,表达式Locale.CANADA是表示加拿大地区的Locale对象。
   Locale类的构造函数如下:

Locale(String language)
Locale(String language,String country)
Locale(String language,String country,String variant)

   这些构造函数用来构建表示特定语言以及特定国家(对于后面两个构造函数)的Locale对象。这些值必须包含标准语言和国家代码。辅助信息可以通过variant提供。
   Locale类定义了一些方法。其中最重要的方法之一是setDefault(),如下所示:

static void setDefault(Locale localeObj)

   下面是其他一些方法:

final String getDisplayCountry()
final String getDisplayLanguage()
final String getDisplayName()

   这些方法返回人类能够阅读的字符串,这些字符串用于显示国家的名称、语言的名称以及地区的完整描述。
   使用getDefault()方法可以获取默认地区,如下所示:

static Locale getDefault()

   JDK7对Locale类进行了重要升级、新的Locale类能够支持互联网工程任务组BCP47和Unicode技术标准35,其中前者定义了用来标识语言的标签,后者定义了地区数据标记语言。对BCP47和UTS35的支持导致为Locale类添加了几种特性,包括一些新方法和Locale.Builder类。在这些新特性中,新方法包括getScript()和toLanguageTag(),前者获取地区的脚本,后者获取包含地区语言标签的字符串。Locale.Builder类来构造Locale实例,确保地区说明被很好地根据BCP47定义的要求进行了形式化(Locale构造函数没有提供这一检查)。JDK8也为Locale类添加了一些方法,以支持筛选。扩展和查找等操作。
   Calendar和GregorianCalendar是以地区敏感方式使用的类的例子。DateFormat和SimpleDateFormat也依赖于地区。

  相关解决方案