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接口。
方 法 | 描 述 |
---|---|
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是布尔型变量,指示了是否设置了当前时间。
方 法 | 描 述 |
---|---|
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只支持一个默认构造函数。
方 法 | 描 述 |
---|---|
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也依赖于地区。