Java Date
java.util包提供了Date类来封装当前日期和时间。提供了两个构造方法来实例化Date对象
- Java 日期时间
- 获取当前日期时间
- 日期比较
- 使用SimpleDateFormat格式化日期
- 格式化编码表
- 使用printf格式化日期
- 将字符串解析为时间
- Java 休眠
- 测量时间
- Calendar 类
- Calendar类对象信息的设置
- Calendar类对象信息获得
Java 日期时间
-
第一个使用当前日期和时间来初始化对象
Date();
-
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数
Date(long millisec);
编号 | 方法和描述 |
---|---|
1 | boolean after(Date date) 若调用此方法的Date对象在指定日期之后返回true,否则返回false |
2 | boolean before(Date date) 当调用此方法的Date对象在指定日期之前返回true,否则返回false |
3 | Object clone() 返回此对象的副本 |
4 | int compareTo(Date date) 比较调用此方法的Date对象和指定日期。两者相等返回0,调用对象在指定日期前返回负数,调用对象在指定日期之后返回正数 |
5 | int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date)否则抛出ClassCastExceptino |
6 | boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true否则返回false |
7 | long getTime() 返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数 |
8 | int hashCode() 返回此对象的哈希值 |
9 | void setTime(long time) 用自1970年1月1日00:00:00 GMT 以后time毫秒数设置时间和日期 |
10 | String toString() 把此Date对象转换为以下形式的String:dow mon dd hh:mm:ss zzz yyy 其中dow是一周中的某一天(Sum,Mon,Tue,Wed,Thu,Fri,Sat) |
获取当前日期时间
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();
// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
}
日期比较
- 使用getTime()方法获取两个日期(自1970年1月1日经历的毫秒数),然后比较这两个值
- 使用before(),after()和equals().例如一个月的12好比18好早,则new Date(99,2,12).berfore(new Date(99,2,18))则返回true
- 使用compareTo()方法,它是由Comparable接口定义的,Date类实现了这个接口
使用SimpleDateFormat格式化日期
是一个以语言环境敏感的方式来格式化和分析日期的类,SimpleDateFormat允许你选择任何用户自定义日期时间格式来运行
示例
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(dNow));
}
}
注意:格式化需要区分大小写。大小写表示的含义不同。
格式化编码表
字母 | 描述 | 示例 |
---|---|---|
G | 纪元标记 | AD |
y | 四位年份 | 2019 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M/P.M(12时制) | 11 |
H | 24小时制 | 23 |
m | 分钟 | 60 |
s | 秒 | 60 |
S | 毫秒 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2(second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M/P.M 标记 | PM |
k | 一天中的小时 | 24 |
K | A.M/P.M(0-11)格式小时 | 10 |
z | 时区 | Eastern Standard Time |
‘ | 文字定界符 | Delimiter |
“ | 单引号 | ‘ |
使用printf格式化日期
使用两个字母格式,以%t
开头
转换符 | 描述 | 示例 |
---|---|---|
c | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
F | “年-月-日”格式 | 2019-01-02 |
D | “月/日/年”格式 | 01/02/2019 |
r | “HH:MM:SS PM”12小时格式 | 02:25:51 下午 |
T | “HH:MM:SS”24小时格式 | 14:20:12 |
R | “HH:MM”格式24制 | 15:30 |
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();
//c的使用
System.out.printf("全部日期和时间信息:%tc%n",date);
//f的使用
System.out.printf("年-月-日格式:%tF%n",date);
//d的使用
System.out.printf("月/日/年格式:%tD%n",date);
//r的使用
System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);
//t的使用
System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);
//R的使用
System.out.printf("HH:MM格式(24时制):%tR",date);
}
}
如果你需要重复提供日期,那么利用这种方式来格式化它的每一部分就有点复杂了。因此,可以利用一个格式化字符串指出要被格式化的参数的索引。
索引必须紧跟在%后面,而且必须以$结束。
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();
// 使用toString()显示日期和时间
System.out.printf("%1$s %2$tB %2$td, %2$tY",
"Due date:", date);
}
}
你可以使用 < 标志。它表明先前被格式化的参数要被再次使用。例如:
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();
// 显示格式化时间
System.out.printf("%s %tB %<te, %<tY",
"Due date:", date);
}
}
定义日期格式的转换符可以使日期通过指定的转换符生成新的字符串。
import java.util.*;
public class DateDemo {
public static void main(String args[]) {
Date date=new Date();
//b的使用,月份简称
String str=String.format(Locale.US,"英文月份简称:%tb",date);
System.out.println(str);
System.out.printf("本地月份简称:%tb%n",date);
//B的使用,月份全称
str=String.format(Locale.US,"英文月份全称:%tB",date);
System.out.println(str);
System.out.printf("本地月份全称:%tB%n",date);
//a的使用,星期简称
str=String.format(Locale.US,"英文星期的简称:%ta",date);
System.out.println(str);
//A的使用,星期全称
System.out.printf("本地星期的简称:%tA%n",date);
//C的使用,年前两位
System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date);
//y的使用,年后两位
System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date);
//j的使用,一年的天数
System.out.printf("一年中的天数(即年的第几天):%tj%n",date);
//m的使用,月份
System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date);
//d的使用,日(二位,不够补零)
System.out.printf("两位数字的日(不足两位前面补0):%td%n",date);
//e的使用,日(一位不补零)
System.out.printf("月份的日(前面不补0):%te",date);
}
}
将字符串解析为时间
SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。
示例
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
Java 休眠
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。
你可以让程序休眠一毫秒的时间或者到您的计算机的寿命长的任意段时间。例如,下面的程序会休眠3秒:
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "
");
Thread.sleep(1000*3); // 休眠3秒
System.out.println(new Date( ) + "
");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
测量时间
示例
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "
");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "
");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Calendar 类
我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。
Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可
-
创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是档期日期。
2. 创建一个指定日期的Calendar对象//创建一个代表特定时间Calendar对象 Calendar c1 = Calendar.getInstance(); c1.set(2019,2-1,12)
常量 | 简介 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,意义如上 |
Calendar.HOUR | 12小时制 |
Calendar.HOUR_OF_DAY | 24小时制 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
Calendar类对象信息的设置
- Set
例如:
Calendar c1 = Calendar.getInstance();
调用:
public final void set(int year,int month,int date)
c1.set(2019,2-1,12)//把c1设置为2019,2,12
利用字段类型设置
public void set(int field,int value)
c1.set(Calendar.YAER,20018);
- Add设置
Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DATE,10)//日期+10
c1.add(Calendar.DATE,-1)//日期-10
Calendar类对象信息获得
Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);
GregorianCalendar类
实现了公历日历
GregorianCalendar是Calendar类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。
下面列出GregorianCalendar对象的几个构造方法:
序号 | 方法说明 |
---|---|
1 | GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar |
2 | GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar |
5 | GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar |
6 | GregorianCalendar(TimeZone zone) |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar |
GregorianCalendar 类提供的一些有用的方法列表
序号 | 方法 |
---|---|
1 | void add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中 |
2 | protected void computeFields() 转换UTC毫秒值为时间域值 |
3 | protected void computeTime() 覆盖Calendar ,转换时间域值为UTC毫秒值 |
4 | boolean equals(Object obj) 比较此 GregorianCalendar 与指定的 Object |
5 | int get(int field) 获取指定字段的时间值 |
6 | int getActualMaximum(int field) 返回当前日期,给定字段的最大值 |
7 | int getActualMinimum(int field 返回当前日期,给定字段的最小值 |
8 | int getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值 |
9 | Date getGregorianChange() 获得格里高利历的更改日期 |
10 | int getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值 |
11 | int getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值 |
12 | Date getTime() 获取日历当前时间 |
13 | long getTimeInMillis() 获取用长整型表示的日历的当前时间 |
14 | TimeZone getTimeZone() 获取时区 |
15 | int getMinimum(int field) 返回给定字段的最小值 |
16 | int hashCode() 重写hashCode. |
17 | boolean isLeapYear(int year) 确定给定的年份是否为闰年 |
18 | void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段 |
19 | void set(int field, int value) 用给定的值设置时间字段 |
20 | void set(int year, int month, int date) 设置年、月、日的值 |
21 | void set(int year, int month, int date, int hour, int minute) 设置年、月、日、小时、分钟的值 |
22 | void set(int year, int month, int date, int hour, int minute, int second) 设置年、月、日、小时、分钟、秒的值 |
23 | void setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期 |
24 | void setTime(Date date) 用给定的日期设置Calendar的当前时间 |
25 | void setTimeInMillis(long millis) 用给定的long型毫秒数设置Calendar的当前时间 |
26 | void setTimeZone(TimeZone value) 用给定时区值设置当前时区 |
27 | String toString() 返回代表日历的字符串 |
示例
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {
"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};
int year;
// 初始化 Gregorian 日历
// 使用当前时间和日期
// 默认为本地时间和时区
GregorianCalendar gcalendar = new GregorianCalendar();
// 显示当前时间和日期的信息
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));
// 测试当前年份是否为闰年
if(gcalendar.isLeapYear(year)) {
System.out.println("当前年份是闰年");
}
else {
System.out.println("当前年份不是闰年");
}
}
}