Java 关于时间日期的处理有两个基础类 Calendar 和 Date 。
Calendar 有子类 GregorianCalendar ;
Date 有子类 (java.sql.) Date, Time, Timestamp ;
Calendar类:Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar ca = Calendar.getInstance();//获取自身的时间对象
该对象可以调用下面的方法将日历翻到指定的一个时间:
1 void set(int year,int month,int date); 2 void set(int year,int month,int date,int hour,int minute); 3 void set(int year,int month,int date,int hour,int minute,int second);若要调用有关年份、月份、小时、星期等信息,可以通过调用下面的方法实现:
int get(int field);
其中,参数 field 的值由 Calendar 类的静态常量决定。其中:YEAR 代表年,MONTH 代表月,HOUR 代表小时,MINUTE 代表分,如:
calendar.get(Calendar.MONTH);
如果返回值为 0 代表当前日历是一月份,如果返回 1 代表二月份,依此类推。
由 Calendar 定义的一些常用方法如下表所示:
| 方法 | 功能 |
|---|---|
| abstract void add(int which,int val) | 将 val 加到 which 所指定的时间或者日期中,如果需要实现减的功能,可以加一个负数。which 必须是 Calendar 类定义的字段之一,如 Calendar.HOUR |
| boolean after( calendarObj) | 如果调用 Calendar 对象所包含的日期比 calendarObj 指定的对象所包含的日期晚,返回 true,否则返回 false |
| boolean before( calendarObj) | 如果调用 Calendar 对象所包含的日期比 calendarObj 指定的对象所包含的日期早,返回 true,否则返回 false |
| final void clear() | 对调用对象包含的所有时间组成部分清零 |
| final void clear(int which) | 对调用对象包含的 which 所指定的时间组成部分清零 |
| boolean equals( calendarObj) | 如果调用 Calendar 对象所包含的日期和 calendarObj 指定的对象所包含的日期相等,返回 true,否则返回 false |
| int get(int calendarField) | 返回调用 Calendar 对象的一个时间组成部分的值,这个组成部分由 calendarField指定,可以被返回的组成部分如:Calendar.YEAR,Calendar.MONTH 等 |
| static Calendar getInstance() | 返回使用默认地域和时区的一个 Calendar 对象 |
| final Date getTime() | 返回一个和调用对象时间相等的 Date 对象 |
| final boolean isSet(int which) | 如果调用对象所包含的 which 指定的时间部分被设置了,返回 true,否则返回 false |
| final void set(int year,int month) | 设置调用对象的各种日期和时间部分 |
| final void setTime(Date d) | 从 Date 对象 d 中获得日期和时间部分 |
| void setTimeZone(TimeZone t) | 设置调用对象的时区为 t 指定的那个时区 |
重要方法 :
public void add(int field,int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中。
对于日期运算很便捷。
Calendar ca = Calendar.getInstance();//获取自身的时间对象
System.out.println(ca);
ca.add(Calendar.DAY_OF_MONTH, 11);//参数一Calendar字段,参数二要增加的值
System.out.println(ca);
Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个:
- Date():使用当前的日期和时间初始化一个对象。
- Date(long date):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 date 毫秒。如果运行 Java 程序的本地时区是北京时区(与格林威治时间相差 8 小时),Date date=new Date(1000);,那么对象 date 就是1970年01月01日08时00分01秒。
longgetTime()
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
public void test1() {
Date date1 = new Date(1000*60*60*24*5);//现在时间为1970年1月1日的五天后
System.out.println(date1);//Tue Jan 06 08:00:00 CST 1970
System.out.println(date1.toString());//Tue Jan 06 08:00:00 CST 1970
long msec1=date1.getTime();
System.out.println(\"从1970年1月1日0时到现在共有:\" + msec1 + \"毫秒\");//从1970年1月1日0时到现在共有:432000000毫秒
Date date2 = new Date();
System.out.println(date2);//Thu Dec 20 11:37:58 CST 2018
System.out.println(date2.toString());//Thu Dec 20 11:37:58 CST 2018
long msec2=date2.getTime();
System.out.println(\"从1970年1月1日0时到现在共有:\" + msec2 + \"毫秒\");//从1970年1月1日0时到现在共有:1545277078804毫秒
}
一些比较常用的 Date 类方法:
| 方法 | 功能 |
|---|---|
| boolean after(Date date) | 若调用 Date 对象所包含的日期比 date 指定的对象所包含的日期晚,返回 true,否则返回 false。 |
| boolean before(Date date) | 若调用 Date 对象所包含的日期比 date 指定的对象所包含的日期早,返回 true,否则返回 false。 |
| clone() | 复制调用 Date 对象。 |
| int compareTo(Date date) | 比较调用对象所包含的日期和指定的对象包含的日期,若相等返回 0;若前者比后者早,返回负值;否则返回正值。 |
| long getTime() | 以毫秒数返回从 1970 年 01 月 01 日 00 时到目前的时间。 |
| int hashCode() | 返回调用对象的散列值。 |
| void setTime(long time) | 根据 time 的值,设置时间和日期。time 值从 1970 年 01 月 01 日 00 时开始计算。 |
| String toString() | 把调用的 Date 对象转换成字符串并返回结果。 |
| public Static String valueOf(type variable) | 把 variable 转换为字符串。 |
Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。若需要修改时间显示的格式可以使用“SimpleDateFormat(String pattern)”方法。
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
日期和时间模式
日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母
\'A\'到\'Z\'和\'a\'到\'z\'被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (\') 引起来,以免进行解释。\"\'\'\"表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。
定义了以下模式字母(所有其他字符 \'A\' 到 \'Z\' 和 \'a\' 到 \'z\' 都被保留):
字母 日期或时间元素 表示 示例 GEra 标志符 Text ADy年 Year 1996;96M年中的月份 Month July;Jul;07w年中的周数 Number 27W月份中的周数 Number 2D年中的天数 Number 189d月份中的天数 Number 10F月份中的星期 Number 2E星期中的天数 Text Tuesday;TueaAm/pm 标记 Text PMH一天中的小时数(0-23) Number 0k一天中的小时数(1-24) Number 24Kam/pm 中的小时数(0-11) Number 0ham/pm 中的小时数(1-12) Number 12m小时中的分钟数 Number 30s分钟中的秒数 Number 55S毫秒数 Number 978z时区 General time zone Pacific Standard Time;PST;GMT-08:00Z时区 RFC 822 time zone -0800
日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。Date date = new Date(); System.out.println(date);//Thu Dec 20 12:35:31 CST 2018 SimpleDateFormat sdf1 = new SimpleDateFormat(\"yyyy年MM月dd日HH时mm分ss秒\"); System.out.println(sdf1.format(date));//2018年12月20日12时35分31秒 SimpleDateFormat sdf2 = new SimpleDateFormat(\"北京时间:yyyy年MM月dd日HH时mm分ss秒\"); System.out.println(sdf2.format(-1000));//北京时间:1970年01月01日07时59分59秒
继续阅读与本文标签相同的文章
-
搭建自己的技术博客系列(一)使用 hexo 搭建一个精美的静态博客
2026-05-18栏目: 教程
-
搭建自己的技术博客系列(二)把 Hexo 博客部署到 GitHub 上
2026-05-18栏目: 教程
-
CMU 15-721 14-数据库调度 Scheduling
2026-05-18栏目: 教程
-
从校招生到核心架构师,支付宝研究员李俊奎谈如何成为一名优秀的程序员
2026-05-18栏目: 教程
-
【阿里云十年,因为有我而不同】有一种糖叫语法糖【5】IOT三连之设备之扩展操作
2026-05-18栏目: 教程
