Java处理时间和日期

1 相关类

1.1 java.util.Date

Date类 表示特定的瞬间,精确到毫秒。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、小时、分钟和秒值的方法已废弃。

1.2 java.text.DateFormat(抽象类)

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。

1.3 java.text.SimpleDateFormat(DateFormat的直接子类)

SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。
SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。

1.4 java.util.Calendar(抽象类)

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

1.5 java.util.GregorianCalendar(Calendar的直接子类)

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家是在 1582 年 10 月 15 日创立,在其他国家要晚一些)。可由调用方通过调用 setGregorianChange() 来更改起始日期。

2 相关类的具体使用

2.1 java.util.Date的使用

2.1.1 构造函数
/**
*分配 Date 对象并用当前时间初始化此对象,以表示分配它的时间(精确到毫秒)。
*/
Date()

/**
*分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,
*即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
*/	
Date(long date)
2.1.2 方法摘要
boolean after(Date when)
          测试此日期是否在指定日期之后。
 
 boolean before(Date when)
          测试此日期是否在指定日期之前。
 
 Object clone()
          返回此对象的副本。
 
 int compareTo(Date anotherDate)
          比较两个日期的顺序。
 
 boolean equals(Object obj)
          比较两个日期的相等性。
 
 long getTime()
          返回自 19701100:00:00 GMT 以来此 Date 对象表示的毫秒数。
 
 int hashCode()
          返回此对象的哈希码值。
 
 void setTime(long time)
          设置此 Date 对象,以表示 19701100:00:00 GMT 以后 time 毫秒的时间点。
 
 String toString()
          把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:
          dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
          mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。
          dd 是一月中的某一天(0131),显示为两位十进制数。
          hh 是一天中的小时(0023),显示为两位十进制数。
          mm 是小时中的分钟(0059),显示为两位十进制数。
          ss 是分钟中的秒数(0061),显示为两位十进制数。
          zzz 是时区(并可以反映夏令时)。标准时区缩写包括方法 parse 识别的时区缩写。如果不提供时区信息,则 zzz 为空,即根本不包括任何字符。
          yyyy 是年份,显示为 4 位十进制数。
2.1.4 示例
Date date = new Date();
System.out.println(date);
System.out.println(date.getTime());

2.2 java.text.SimpleDateFormat的使用

2.2.1 模式表
字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800
2.2.2 示例
// 将日期转化为指定的格式
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate = format.format(date);
System.out.println(formatDate);

2.3 java.util.Calendar类

2.3.1 需要注意一些地方

1、Calendar的星期是从周日开始的,常量值为0。
2、Calendar的月份是从一月开始的,常量值为0。
3、Calendar的每个月的第一天值为1

2.4 java.util.GregorianCalendar(Calendar的直接子类)

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统

2.4.1 创建Calendar的方式
Calendar now1 = Calendar.getInstance();
Calendar now2 = new GregorianCalendar();
Calendar now3 = new GregorianCalendar(2016, 01, 24);
Calendar now4 = new GregorianCalendar(2016, 01, 24, 15, 55);      //陷阱:Calendar的月份是0~11 
Calendar now5 = new GregorianCalendar(2016, 01, 24, 15, 55, 44);
Calendar now6 = new GregorianCalendar(Locale.US);
Calendar now7 = new GregorianCalendar(TimeZone.getTimeZone("GMT-8:00"));
2.4.2 输出指定格式的日期
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒 E", Locale.CHINA);
System.out.println("获取日期中文格式化化输出:" + df.format(now1.getTime()));
2.4.3 通过Calendar获取日期中年月日等相关信息
System.out.println("获取年:" + now5.get(Calendar.YEAR));
System.out.println("获取月(月份是从0开始的):" + now5.get(Calendar.MONTH));
System.out.println("获取日:" + now5.get(Calendar.DAY_OF_MONTH));
System.out.println("获取时:" + now5.get(Calendar.HOUR));
System.out.println("获取分:" + now5.get(Calendar.MINUTE));
System.out.println("获取秒:" + now5.get(Calendar.SECOND));
System.out.println("获取上午、下午:" + now5.get(Calendar.AM_PM));
System.out.println("获取星期数值(星期是从周日开始的):" + now5.get(Calendar.DAY_OF_WEEK));
2.4.4 通用星期中文化转换
String dayOfWeek[] = {"", "日", "一", "二", "三", "四", "五", "六"};
System.out.println("now对象的星期是:" + dayOfWeek[now.get(Calendar.DAY_OF_WEEK)]);
2.4.5 通用月份中文化转换
String months[] = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};
System.out.println("now5对象的月份是: " + months[now5.get(Calendar.MONTH)]);
2.4.6 示例
 //获取当前月份的最大天数
Calendar cal = Calendar.getInstance();
int maxday=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
int minday=cal.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(maxday);
//取当月的最后一天  
DateFormat formatter3=new SimpleDateFormat("yyyy-MM-"+maxday);
System.out.println(formatter3.format(cal.getTime()));
//取当月的最后一天  
DateFormat formatter4=new SimpleDateFormat("yyyy-MM-"+minday);
System.out.println(formatter4.format(cal.getTime()));
//求两个日期之间相隔的天数
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
java.util.Date beginDate= format.parse("2007-12-24");
java.util.Date endDate= format.parse("2007-12-25");
long day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
System.out.println("相隔的天数="+day);
//一年前的日期
java.text.Format formatter5=new java.text.SimpleDateFormat("yyyy-MM-dd");
java.util.Date todayDate=new java.util.Date();
long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;
todayDate.setTime(beforeTime*1000);
String beforeDate=formatter5.format(todayDate);
System.out.println(beforeDate);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -1);
System.out.println(formatter5.format(calendar.getTime()));
//当前星期的星期一和星期日
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int dayInWeek = gregorianCalendar.get(Calendar.DAY_OF_WEEK);
int offset = 0;
if (dayInWeek == 1) {
// 星期天
offset = 6;
} else {
// 星期一至星期六
offset = dayInWeek - 2;
}
gregorianCalendar.add(GregorianCalendar.DAY_OF_MONTH, -offset);
String sday = dateFormat.format(gregorianCalendar.getTime());
gregorianCalendar.add(GregorianCalendar.DAY_OF_MONTH, 6);
String eday = dateFormat.format(gregorianCalendar.getTime());

System.out.println("这个星期的星期一:" + sday);3.
System.out.println("这个星期的星期天:" + eday);

3 计算那个时间的时间差

Instant start  = Instant.now();
for (int i = 0; i < 10000; i++) {
	System.out.println("0");
}
Instant end  = Instant.now();

Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
System.out.println(millis);

4 日期调整器

对于日程安排应用来说,经常需要计算诸如“每个月的第一个星期二”这样的日期。Temporal Adjusters类提供了大量用于常见调整的静态方法。你可以将调整方法的结果传递给with方法。例如,某个月的第一个星期二可以像下面这样计算:

Local Date firstTuesday = Local Date.of(year, month, l).with(
Temporal Adjusters.nextOrSame(DayOfWeek.TUESDAY));

一如既往,with方法会返回一个新的LocalDate对象,而不会修改原来的对象。下表展示了可用的调整器。

方 法描 述
next(weekday), prevlous(weekday)下一个或上一个给定的星期日期
nextOrSame(weekday),
previousOrSame(weekday)
从绐定的H期幵始的下一个或上一个给定的M期H期
dayOfWeeKInMonth(n, weekday)月份中的第n个weekday
lastInMonth(weekday)月份中的最后一个weekday
firstDayOfMonth()
firstDayOfNextMonth(),
firstDayOfNextYear()
firstDayOfMonth(),
lastDayOfYear()
方法名所描述的口期
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java提供了许多用于处理日期时间的类和方法。其中最常用的是: 1. Date类:表示日期时间的类。现在已经被废弃,不建议使用。 2. Calendar类:是一个抽象类,提供了处理日期时间的方法。 3. SimpleDateFormat类:可以将日期时间格式化成指定的字符串。 4. LocalDateTime类:Java 8引入的新类,用于表示日期时间,提供了许多方便的方法。 5. Duration类和Period类:用于表示时间间隔。 下面是一些示例代码: 1. 获取当前日期时间 ```java Date date = new Date(); System.out.println(date); LocalDateTime now = LocalDateTime.now(); System.out.println(now); ``` 2. 格式化日期时间 ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedDate = sdf.format(date); System.out.println(formattedDate); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedNow = now.format(formatter); System.out.println(formattedNow); ``` 3. 计算时间间隔 ```java LocalDateTime start = LocalDateTime.of(2021, 1, 1, 0, 0, 0); LocalDateTime end = LocalDateTime.now(); Duration duration = Duration.between(start, end); System.out.println(duration.toDays()); LocalDate startDate = LocalDate.of(2021, 1, 1); LocalDate endDate = LocalDate.now(); Period period = Period.between(startDate, endDate); System.out.println(period.getYears()); ``` 这里只是简单介绍了一些Java处理日期时间的基础知识,具体的使用方法还需要根据实际需求进行学习和掌握。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值