Java 中计算时间和日期的方式
简要:
Java中计算日期时间的有 Date
类 加 SimpleDateFormat
类和 System
类中的 currentTimeMillis
方法,还有专门用于日期的 Calendar
类。这里就介绍如何使用这三种方式获取当前时间,以及一些注意点。
注意:当前计算机时间是跟你的计算机所在时区是有关的!!!所以会有时差
GMT时间(格林威治时间)1970年1月1号0时0分0秒
中国东八区相差8小时(北京时间)1970年1月1号8时0分0秒
一、Date 类 加 SimpleDateFormat 类
// 注意使用的是 java.util 包下的
Date date = new Date();
/*
常用的:
yyyy 年 (年份四位数)
MM 月 (两位数 12个月)
dd 日 两位数 不确定)
HH 时 24制 / hh 12制
mm 分 (两位数 60进制)
ss 秒 (两位数 60进制)
SSS 毫秒 (1000 毫秒 == 1 秒)
*/
// java.text 包下的,用于日期格式化
// 其它符号如(- : .)就是连接符,原样输出,也可以是中文
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
System.out.println(date);// Thu Nov 26 10:43:47 CST 2020
System.out.println(sdf1.format(date));// 2020-11-26 10:43:47.999
System.out.println(sdf2.format(date));// 2020年11月26日 10时51分02秒
// String 转 Date 使用 SimpleDateFormat 的 parse 方法
// 格式需要相同,否则会解析异常抛出 ParseException
try {
String time = "2008-08-08 08:08:08.888";
Date parse = sdf1.parse(time);
System.out.println(parse);// Fri Aug 08 08:08:08 CST 2008
} catch (ParseException e) {
e.printStackTrace();
}
// 参数是 毫秒 ,从1970年1月1日00:00:00开始的总毫秒数。
/*
这里就会发现一个问题 这是从1970-01-01 08:00:00.000开始的.
为什么呢?
其中两者相差 28800 = 8 * 60 * 60 ,即相差八个小时,
而 1970-1-1 00:00:00.00 是世界时间(英国格林威治)。
中国属于东八区,会把时间增加8个小时,
这就知道 1970-01-01 08:00:00.000 是中国时间(北京时间),
在连接数据库时你也会发现差八个小时。
*/
Date date1 = new Date(1000);
System.out.println(sdf1.format(date1));// 1970-01-01 08:00:01.000
二、System 类中的 currentTimeMillis 方法
用这个求年月日太麻烦了,一般用于方法的执行时间计算,因为是毫秒级的
// 获取自 1970年1月1日 00:00:00 000 到当前系统时间的总毫秒数。
// 更正:本人所处中国,所以是 1970年1月1日 08:00:00 000
long totalMilliSeconds = System.currentTimeMillis();
System.out.println(totalMilliSeconds);// 1606380866748
//单位从毫秒转换为秒
long totalSeconds = totalMilliSeconds / 1000;
//求出现在的秒
long currentSecond = totalSeconds % 60;
//求出现在的分
long totalMinutes = totalSeconds / 60;
long currentMinute = totalMinutes % 60;
//求出现在的小时
long totalHour = totalMinutes / 60;
long currentHour = totalHour % 24;
//显示时间
System.out.println("总毫秒为: " + totalMilliSeconds);
System.out.println(currentHour + ":" + currentMinute + ":" + currentSecond + " GMT");
//8:54:26 GMT 格林威治时间
// 因为年日不是太规律的,还是不好换算,所以 Date 方便
Date nowTime = new Date(totalMilliSeconds);
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String retStrFormatNowDate = sdf3.format(nowTime);
System.out.println(retStrFormatNowDate);// 2020-11-26 16:54:26.748
三、Calendar 类(日历类)
以下代码摘自:http://www.51gjie.com/java/611.html
// 完整显示日期时间
String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
System.out.println(str);
// 创建 Calendar 对象
Calendar calendar = Calendar.getInstance();
// 初始化 Calendar 对象,但并不必要,除非需要重置时间
calendar.setTime(new Date());
// setTime 类似上面一行
// Date date = new Date();
// calendar.setTime(date);
// 显示年份
int year = calendar.get(Calendar.YEAR);
System.out.println("YEAR is = " + String.valueOf(year));
// 显示月份 (从0开始, 实际显示要加一)
int MONTH = calendar.get(Calendar.MONTH);
System.out.println("MONTH is = " + (MONTH + 1));
// 今年的第 N 天
int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR);
// 本月第 N 天
int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH));
// 3小时以后
calendar.add(Calendar.HOUR_OF_DAY, 3);
int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY);
// 当前分钟数
int MINUTE = calendar.get(Calendar.MINUTE);
System.out.println("MINUTE = " + MINUTE);
// 15 分钟以后
calendar.add(Calendar.MINUTE, 15);
MINUTE = calendar.get(Calendar.MINUTE);
System.out.println("MINUTE + 15 = " + MINUTE);
// 30分钟前
calendar.add(Calendar.MINUTE, -30);
MINUTE = calendar.get(Calendar.MINUTE);
System.out.println("MINUTE - 30 = " + MINUTE);
// 格式化显示
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
System.out.println(str);
// 重置 Calendar 显示当前时间
calendar.setTime(new Date());
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
System.out.println(str);
// 创建一个 Calendar 用于比较时间
Calendar calendarNew = Calendar.getInstance();
// 设定为 5 小时以前,后者大,显示 -1
calendarNew.add(Calendar.HOUR, -5);
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
// 设定7小时以后,前者大,显示 1
calendarNew.add(Calendar.HOUR, +7);
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
// 退回 2 小时,时间相同,显示 0
calendarNew.add(Calendar.HOUR, -2);
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
运行结果
2020-11-26 17:15:53:593
YEAR is = 2020
MONTH is = 11
DAY_OF_YEAR is = 331
DAY_OF_MONTH = 26
HOUR_OF_DAY + 3 = 20
MINUTE = 15
MINUTE + 15 = 30
MINUTE - 30 = 0
2020-11-26 20:00:53:594
2020-11-26 17:15:53:594
时间比较:-1
时间比较:1
时间比较:0
四、参考
http://www.51gjie.com/java/611.html
System.currentTimeMillis()计算方式与时间的单位转换
Java的常用API之Date类简介