第九章日期工具类使用

1、时间戳概念

        时间戳是指格林威治时间 1970 01 01 00 00 00 ( 北京时间 1970 01 01 08 00 00 ) 起至现在的总秒数,本质是一个 long 类型的整数,表示日期对象。
         java 体系的时间戳是毫秒 。
long ss = System.currentTimeMillis();
//
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
long ee = System.currentTimeMillis();
System.out.printf("ms:%d %n", ee - ss);
System.out.println(System.currentTimeMillis());
System.out.printf("%tF %<tT%n", 0L);
System.out.printf("%tF %<tT%n", 1675848496621L);

2、java.util.Date

2.1什么是Date类???

java.util.Date

在util包下 ,Date类表示日期

         Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。

Date 类有如下两个构造方法。

          Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。

          Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 1 1 0 0 0 秒开始经过参数 date 指定的毫秒数。

Date date1 = new Date(); // 调用无参数构造函数
System.out.println(date1.toString()); // 输出:Wed May 18 21:24:40 CST
2016
Date date2 = new Date(60000); // 调用含有一个long类型参数的构造函数
System.out.println(date2); // 输出:Thu Jan 0108:01:00 CST 1970
         Date 类的无参数构造方法获取的是系统当前的时间,显示的顺序为星期、月、日、小时、分、秒、年。
         Date 类带 long 类型参数的构造方法获取的是距离 GMT 指定毫秒数的时间, 60000 毫秒是一分钟,而 GMT (格林尼治标准时间)与 CST (中央标准时间)相差 8 小时,也就是说 1970 1 1 00:00:00 GMT 1970 1 1 08:00:00 CST 表示的是同一时间。 因此距离 1970 1 1 00:00:00 CST 分钟的时间为 1970 1 1 00:01:00 CST ,即使用 Date 对象表示为 Thu Jan 01 08:01:00 CST 1970


// 2000-12-16
// 2000.12.16
// 定义输出格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将字符串转化为日期
Date date = sdf.parse("2000-11-11 11:11:11");
System.out.println(date);
Date date = new Date();
// 将日期转化为字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String str = sdf.format(date);
System.out.println(str);
var now = new Date(); // 创建一个Date对象,获取当前时间
// 指定格式化格式
var f = new SimpleDateFormat("今天是 " + "yyyy 年 MM 月 dd 日 E HH 点 mm 分 ss
秒");
System.out.println(f.format(now)); // 将当前时间袼式化为指定的格式
package cn.webrx;
import java.util.Date;
public class Date1 {
public static void main(String[] args) {
//构造方法 实例化对象
Date d1 = new Date();
Date d2 = new Date(System.currentTimeMillis());
Date d3 = new Date(1675848496621L);
System.out.printf("%tF %<tT%n", d1);
System.out.printf("%tF %<tT%n", d2);
System.out.printf("%tF %<tT%n", d3);
//常用方法
long now = d1.getTime();
d1.setTime(now + (1000 * 60 * 60 * 24 * 10));
System.out.printf("%tF %<tT%n", d1);
//计算两个日期之间的天数 1989-10-15 出生 到目前生活了多少天?
Date ss = new Date(2023 - 1900, 2 - 1, 1, 8, 20, 30);
long t1 = ss.getTime();
//System.out.printf("%tF %<tT%n", ss);
long t2 = System.currentTimeMillis();
System.out.println((t2 - t1) / (1000 * 60 * 60 * 24));
//给一个日期,计算出5天前的日期,7天后日期
}
public static void number(String[] args) {
long ss = System.currentTimeMillis();
//
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
long ee = System.currentTimeMillis();
System.out.printf("ms:%d %n", ee - ss);
System.out.println(System.currentTimeMillis());
System.out.printf("%tF %<tT%n", 0L);
System.out.printf("%tF %<tT%n", 1675848496621L);
}
}

3、java.util.Calendar

         Calendar 类是一个抽象类,它为特定瞬间与 YEAR MONTH DAY_OF—MONTH HOUR 等日历字段 之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。
         创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar 类的对象。 getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。
Calendar c = Calendar.getInstance();
         当创建了一个 Calendar 对象后,就可以通过 Calendar 对象中的一些方法来处理日期、时间。 Calendar 类的常用方法如表 2 所示

 

          Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。

         Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 Calendar 静态常用给定的 long 值设置此 Calendar void setTimeInMillis(longmillis) 的当前时间值量指定。

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 :星期几。
例如,要获取当前月份可用如下代码:
int month = Calendar.getInstance().get(Calendar.MONTH);
如果整型变量 month 的值是 0 ,表示当前日历是在 1 月份;如果值是 11 ,则表示当前日历在 12 份。
使用 Calendar 类处理日期时间的实例如下:
Calendar calendar = Calendar.getInstance(); // 如果不设置时间,则默认为当前时间
calendar.setTime(new Date()); // 将系统当前时间赋值给 Calendar 对象
System.out.println("现在时刻:" + calendar.getTime()); // 获取当前时间
int year = calendar.get(Calendar.YEAR); // 获取当前年份
System.out.println("现在是" + year + "年");
int month = calendar.get(Calendar.MONTH) + 1; // 获取当前月份(月份从 0 开始,所以加1)
System.out.print(month + "月");
int day = calendar.get(Calendar.DATE); // 获取日
System.out.print(day + "日");
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取今天星期几(以星期日为第一天)
System.out.print("星期" + week);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
System.out.print(hour + "时");
int minute = calendar.get(Calendar.MINUTE); // 获取当前分钟
System.out.print(minute + "分");
int second = calendar.get(Calendar.SECOND); // 获取当前秒数
System.out.print(second + "秒");
int millisecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒数
System.out.print(millisecond + "毫秒");
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
System.out.println("今天是本月的第 " + dayOfMonth + " 天");
int dayOfWeekInMonth = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);
// 获取今天是本月第几周
System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
int many = calendar.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
System.out.println("今天是今年第 " + many + " 天");
Calendar c = Calendar.getInstance();
c.set(2012, 8, 8); // 设置年月日,时分秒将默认采用当前值
System.out.println("设置日期为 2012-8-8 后的时间:" + c.getTime()); // 输出时间上面的
示例代码演示了 Calendar 类中的方法与常量的结合使用,从而完成处理日期的操作。
package cn.webrx;
import java.util.Calendar;
import java.util.Date;
public class Calendar1 {
public static void main(String[] args) {
//获取实例对象
var c = Calendar.getInstance();
// c.set();
// c.get();
System.out.println(c.get(Calendar.HOUR_OF_DAY));
//System.out.println(new Date().getHours());
// c.add();
//设置-7天,获取7天前的日期
c.add(Calendar.DATE, -7);
//日历类转换为Date类
Date d = c.getTime();
//日历类获取时间戳
long ts = c.getTimeInMillis();
System.out.printf("%tF %<tT%n", c);
}
}

4、java8 DateAPI

·LocalDate

jdk1.8 新的日期 API java.time.LocalDate java.util.Date Calendar
此类只有年月日
public class LocalDateDemo {
public static void main(String[] args) {
//实例化
LocalDate d1 = LocalDate.now();
var d2 = LocalDate.of(1985,10,17);
//常用操作 c++
//今日5天后日期
System.out.println(d1.plusDays(5));
//今日3天前日期
System.out.println(d1.minusDays(3));
//今日25个月后的新日期
System.out.println(d1.plus(25, ChronoUnit.MONTHS));
//今日日期的月份 中文效果: 十月
var msn =
d1.getMonth().getDisplayName(TextStyle.FULL,Locale.CHINESE);
System.out.println(msn);
//今日 星期一
var wsn =
d1.getDayOfWeek().getDisplayName(TextStyle.FULL,Locale.CHINESE);
System.out.println(wsn);
//今日 周一
var sn =
d1.getDayOfWeek().getDisplayName(TextStyle.SHORT,Locale.CHINESE);
System.out.println();
//计算两个日期之间的天数
long days = ChronoUnit.DAYS.between(d2,d1);
System.out.printf("%s 到 %s 之间有 %d 天",d2,d1,days);
System.out.println();
//格化输出
System.out.println(d1);
System.out.println(d2);
System.out.printf("%tF%n",d1);
System.out.printf("%tF%n",d2);
System.out.printf("%tY年%<tm月%<td日 %<tA%n",d1);
System.out.printf("%tY年%<tm月%<td日 %<tA%n",d2);
System.out.println(d1.isLeapYear());
//专业的格式工具类java.time.DateTimeFormatter
//var fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E M L");
var fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E M
L",Locale.CHINA);
System.out.println(fmt.format(d1));
System.out.println(fmt.format(d2));
}
}

#运行输出结果如下:
2022-10-22
2022-10-14
2024-11-17
十月
星期一
周一
1985-10-17 到 2022-10-17 之间有 13514 天
2022-10-17
1985-10-17
2022-10-17
1985-10-17
2022年10月17日 星期一
1985年10月17日 星期四
false
2022年10月17日 周一 10 10
1985年10月17日 周四 10 10

·LocalTime

java.time.LocalTime
LocalTime 本地化时间 只有时分秒 没有日期
package cn.webrx;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class LocalTimeDemo {
public static void main(String[] args) {
//LocalTime 实例化
var t1 = LocalTime.now();
var t2 = LocalTime.of(14,30,20);
var t3 = LocalTime.parse("15:25:35",
DateTimeFormatter.ofPattern("HH:mm:ss"));
//简单输出
System.out.println(t1);
System.out.printf("%tT%n",t1);
System.out.println(t2);
System.out.println(t3);
//格式化输出
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH时mm分ss
秒");
System.out.println(df.format(t1));
System.out.println(df.format(t2));
System.out.println(df.format(t3));
System.out.println(t1.plusSeconds(1000));
var
sns=t1.plusSeconds(1000).format(DateTimeFormatter.ofPattern("HH:mm:ss"))
;
System.out.println(sns);
}
}
LocalTime time = LocalTime.now();
System.out.println(time);
System.out.printf("%tT%n", time);
System.out.printf("%tH时%<tM分%<tS秒%n", time);
System.out.println(time.format(DateTimeFormatter.ofPattern("HH:mm:ss"))
);
//运行结果
14:41:47.555682600
14:41:47
14:30:20
15:25:35
14时41分47秒
14时30分20秒
15时25分35秒
14:58:27.555682600
14:58:27

·LocalDateTIme

java.time.LocalDateTime
此类包含了年月日时分秒 相关信息,相当于 LocalDateTime = LocalDate + LocalTime 了相当
于以前的 java.util.Date ,也相当于 java.util.Calendar

 

package cn.webrx;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
public class LocalDateTimeDemo {
public static void main(String[] args) {
var d1 = LocalDateTime.now();
System.out.println(d1);
System.out.printf("%tF %<tT %n",d1);
System.out.printf("%tF%n",d1);
System.out.printf("%tT%n",d1);
System.out.printf("%tY年%<tm月%<td日 %<tH:%<tM:%<tS %<tA %<tp %s
%n",d1,d1.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINA));
//将字符串转换为LocalDateTime
var d2 = LocalDateTime.of(2022,10,17,14,49,50);
System.out.println(d2);
System.out.println(d2.format(DateTimeFormatter.ofPattern("yyyyMM-dd HH:mm:ss")));
System.out.println("--------------------");
String str = "2022-03-15 20:30:40";
var d3 =
LocalDateTime.parse(str,DateTimeFormatter.ofPattern("yyyy-MM-dd
HH:mm:ss"));
System.out.println(d3);
}
}
//程序运行结果
2022-10-17T14:52:30.917551200
2022-10-17 14:52:30
2022-10-17
14:52:30
2022年10月17日 14:52:30 星期一 下午 十月
2022-10-17T14:49:50
2022-10-17 14:49:50
--------------------
2022-03-15T20:30:40
//java.time.LocalDateTime & java.time.DateTimeFormatter
// 获取一天的开始时间
var ss = LocalDateTime.of(date.toLocalDate(), LocalTime.MIN);
System.out.println("-----------");
System.out.println(ss);
System.out.println(ss.format(DateTimeFormatter.ofPattern("yyyy-MM-dd
HH:mm:ss")));
// 获取一天的结束时间
var endOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MAX);
System.out.println(ee);
System.out.println(ee.format(DateTimeFormatter.ofPattern("yyyy-MM-dd
HH:mm:ss")));
//将LocalDateTime对象 获取 毫秒时间戳
long ms =
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
System.out.println(ms);
System.out.println(System.currentTimeMillis());
System.out.printf("%tF %<tT%n", LocalDateTime.now());
LocalDateTime now = LocalDateTime.now();
//秒
long m1 = now.atZone(ZoneOffset.systemDefault()).toEpochSecond();
System.out.println(m1);
//毫秒 在LocalDateTime对象上获取毫秒
long m2 = now.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli();
System.out.println(m2);
//转换为Date
Date d = new Date(m2);
System.out.println(d);
System.out.println(d.getTime());
Calendar c = Calendar.getInstance();
c.setTimeInMillis(m2);
System.out.println(c.getTimeInMillis());
System.out.println(c.getTime().getTime());
//转换为Date
Date d2 = c.getTime();
//毫秒
System.out.println(System.currentTimeMillis());
//获取系统毫秒 时间戳
long mm = Instant.now().toEpochMilli();
Date d = new Date(ms);
System.out.printf("%tF %<tT%n", d);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(1676018963913L);
System.out.printf("%tF %<tT%n", c);
//小练习
//1.求某年某月有多少天?135781012 31 2(28/29) 4 6 9 11 30
var c1 = Calendar.getInstance();
int year = 2024;
int month = 2;
c1.set(year, month, 0);
int days = c1.get(Calendar.DAY_OF_MONTH);
//System.out.printf("%tF %<tT %n", c1);
//System.out.println(c1.get(Calendar.DAY_OF_MONTH));
System.out.printf("%d年%d月有%d天%n",year,month,days);
//2.判断某年是不是闰年?
//判断闰年
var c2 = Calendar.getInstance();
int cy = c2.get(Calendar.YEAR);
for (int year = 1000; year <= cy; year++) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
System.out.printf("%d年是闰年%n", year);
  }
}
//3.指定月的1号日期?
//4.指定月的最后日期?
var c = Calendar.getInstance();
System.out.printf("%tF %<tT %n", c);
c.set(Calendar.MONTH, c.get(Calendar.MONTH));
c.set(Calendar.DATE,1);
System.out.printf("%tF %<tT %n", c);
c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1);
c.set(Calendar.DATE, 0);
System.out.printf("%tF %<tT %n", c);
//5.输出某日期是星期几?
//6.输出某年生肖?
//String字符串对象,本质是char[] 字符数组
String str = "猴鸡狗猪鼠牛虎兔龙蛇马羊";
int year = 2000;
char c = str.charAt(year % 12);
System.out.println(c);
System.out.println("猴鸡狗猪鼠牛虎兔龙蛇马羊".charAt(year%12));
//设置本地化程序环境
Locale.setDefault(Locale.US);
System.out.printf("%tA %<tp%n",System.currentTimeMillis());
//0-6
System.out.println("星期"+"日一二三四五六".charAt(new Date().getDay()));
//1-7 0-6
System.out.println("星期"+"日一二三四五六".charAt(Calendar.getInstance().get(Calendar.DAY_OF_WEEK)-1));

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值