Java日期时间
知识扩展
什么是闰秒?
【百度百科解释】闰秒,是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒); 闰秒一般加在公历年末或公历六月末。全球已经进行了27次闰秒,均为正闰秒。最近一次闰秒在北京时间2017年1月1日7时59分59秒(时钟显示07:59:60)出现。这也是本世纪的第五次闰秒。
Date类
java.lang.Date
构造方法
Date():创建当前的时间对象
Date(long date):该参数是从 1970 年 1 月 1 日起的毫秒数。
具体方法
| 变量和类型 | 方法 | 描述 |
|---|---|---|
| boolean | after(Date when) | 测试此日期是否在指定日期之后 |
| boolean | before(Date when) | 测试此日期是否在指定日期之前 |
| int | compareTo(Date anotherDate) | 比较两个日期的订购 |
| boolean | equals(Object obj) | 比较两个相等的日期 |
| static Date | static Date | 从 Instant对象获得 Date的实例 |
| long | getTime() | 返回自此 Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数 |
| int | hashCode() | 返回此对象的哈希码值 |
| void | setTime() | 将此 Date对象设置为表示格林尼治标准时间1970年1月1日00:00:00之后的 time毫秒的时间点 |
| Instant | toInstant() | 将此 Date对象转换为 Instant |
| String | toString() | 将此 Date对象转换为 String类型 |
代码示例:
import java.util.Date;
public class Test {
public static void main(String[] args) {
//1.创建系统当前时间
Date date1 = new Date();
//2.创建从 1970 年 1 月 1 日起127846184毫秒的时间
Date date2 = new Date(127846184);
//3.时间输出
System.out.println("date1:"+date1);//date1:Wed Apr 27 14:54:03 JST 2022
System.out.println("date2:"+date2.toString());//date2:Fri Jan 02 20:30:46 JST 1970
//4.时间的比较
date1.after(date2);//true
date1.before(date2);//false
date1.equals(date2);//false
//getTime()获取date距离 1970 年 1 月 1 日的毫秒数
System.out.println(date1.getTime()==date2.getTime());//false
System.out.println(date1.compareTo(date2));//true
date1.clone();
}
}
SimpleDateFormat格式化日期时间
SimpleDateFormat是一个用于以区域设置敏感的方式格式化和解析日期的具体类。 它允许格式化(日期→文本),解析(文本→日期)和规范化。
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
这一行代码确立了转换的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。
时间和日期的编码化格式
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("G:yyyy:MM:dd,HH:mm:ss:E");
System.out.println(sdf.format(date));
}
}
时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:
| 字母 | 描述 | 示例 |
|---|---|---|
| G | 纪元标记 | AD |
| y | 四位年份 | 2001 |
| M | 月份 | July or 07 |
| d | 一个月的日期 | 10 |
| h | A.M./P.M. (1~12)格式小时 | 12 |
| H | 一天中的小时 (0~23) | 22 |
| m | 分钟数 | 30 |
| s | 秒数 | 55 |
| S | 毫秒数 | 234 |
| E | 星期几 | Tuesday |
| D | 一年中的日子 | 360 |
| F | 一个月中第几周的周几 | 2 (second Wed. in July) |
| w | 一年中第几周 | 40 |
| W | 一个月中第几周 | 1 |
| a | A.M./P.M. 标记 | PM |
| k | 一天中的小时(1~24) | 24 |
| K | A.M./P.M. (0~11)格式小时 | 10 |
| z | 时区 | Eastern Standard Time |
| ’ | 文字定界符 | Delimiter |
| " | 单引号 | ` |
使用printf格式化日期
printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。
| 转 换 符 | 说 明 | 示 例 |
|---|---|---|
| c | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
| F | "年-月-日"格式 | 2007-10-27 |
| D | "月/日/年"格式 | 10/27/07 |
| r | "HH:MM:SS PM"格式(12时制) | 02:25:51 下午 |
| T | "HH:MM:SS"格式(24时制) | 14:28:16 |
| R | "HH:MM"格式(24时制) | 14:28 |
import java.util.Date;
public class SimpleDateFormatTest {
public static void main(String[] args) {
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);
}
}
输出结果:
全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012
年-月-日格式:2012-09-10
月/日/年格式:09/10/12
HH:MM:SS PM格式(12时制):10:43:36 上午
HH:MM:SS格式(24时制):10:43:36
HH:MM格式(24时制):10:43
Java睡眠(sleep)
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。
利用sleep方法测试时间间隔:
import java.util.Date;
public class SleepTest {
public static void main(String[] args) {
try {
long start = System.currentTimeMillis();
System.out.println("睡眠之前时间"+new Date());
Thread.sleep(5*60*15);
System.out.println("睡眠之后时间:" + new Date());
long end = System.currentTimeMillis();
System.out.println(end-start);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Calendar类
Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。
创建Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期
//创建指定时间对象
Calendar c1 = Calendar.getInstance();
c1.set(2021, 6 - 1, 12);
Calendar对象字段
| 常量 | 描述 |
|---|---|
| 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 | 星期几 |