Java基础教程——Date类和Calendar类

时间:2024-06-23 10:34:26

Date类和Calendar类都是关于日期的类,都在java.util包中,使用时需要import。

Date

java.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时间,精确到毫秒。

Java中有两个Date类,还有一个是java.sql.Date,这个类一般不用,即使在数据库中也不推荐使用。

写代码时注意导入的包一定是java.util包。

import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Date date = new Date(); // 获得当前的系统日期和时间
System.out.println("今天的日期是:" + date);
Date dateL = new Date(0L);// 带参版:参数是毫秒值
System.out.println("Date(long date)的日期是:" + dateL);
long time = date.getTime(); // 获得毫秒数
System.out.println("自1970年1月1日起以毫秒为单位的时间(GMT):" + time);
// Deprecated,不赞成使用。建议使用Calendar代替。
Date dateYMD = new Date(1999, 01, 02);
Date dateYMDHMS = new Date(1999, 01, 02, 10, 10, 10);
}
}

日期格式化

simpleDateFormat.format(_date):把Date类型转为格式化的字符串

simpleDateFormat.parse("1949-10-01"):把格式化的字符串转为Date类型

import java.text.DateFormat;// 抽象类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
// DateFormat:日期文本
public class TestDate格式化 {
public static void main(String[] args) {
Date _date = new Date(); // 获得当前的系统日期和时间
// 创建DateFormat对象
DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// format(Date date):按照指定模式,把日期转为字符串
String _s = _dateFormat.format(_date);
System.out.println("SimpleDateFormat:" + _s);
// -------------------------------
// parse方法:按照指定格式解析
try {
Date parse = _dateFormat.parse("1949-10-01");
System.out.println(parse);
} catch (ParseException e) {
e.printStackTrace();
}
}
}

Date类里很多方法被宣布“过时了”,过时了不是不能用,只是不赞成使用。

比如上面第一段代码中的Date的带年月日的构造方法。

    @Deprecated
public Date(int year, int month, int date) {
this(year, month, date, 0, 0, 0);
}

如果要通过年月日构造一个日期类型的对象,推荐使用Calendar类。


Calendar

java.util.Calendar类(日历)是抽象类,无法实例化。

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
……
}

要得到对象,只能通过调用getInstance方法来获得\

Calendar cal = Calendar.getInstance();

一般得到的是GregorianCalendar的实例对象,可以通过toString()输出结果看到。

方法 解释
Calendar getInstance() 获取Calendar对象
Date getTime() Calendar对象转为Date对象
int get(int fields) 获取fields指定部分的值
void set(int fields, int value) 将value中指定的值设置到fields指定的部分
void add(int fields, int amount) 将amount值添加到fields指定的时间或日期部分
Object clone() 返回调用对象的副本
void clear() 清除当前对象中所有的时间组成部分
boolean after(Object obj) 如果调用对象时间在obj之后,返回true
boolean before(Object obj) 如果调用对象时间在obj之前,返回true
boolean equals(Object obj) 判断调用对象与obj是否相等
import java.util.Calendar;
public class TestCalendar {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
// int _year = 2019, _month = 1, _day = 1;
// cal.set(_year, _month - 1, _day);
System.out.println(cal.get(Calendar.YEAR) + ":年");
System.out.println(cal.get(Calendar.MONTH) + ":月,从0开始算");
System.out.println(cal.get(Calendar.DATE) + ":当天 1-31");
System.out.println(cal.get(Calendar.DAY_OF_MONTH) + ":当天 1-31");
System.out.println(cal.get(Calendar.DAY_OF_WEEK) + ":星期,周日算第1天");
System.out.println(cal.get(Calendar.WEEK_OF_MONTH) + ":月的第n周");
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + ":年的第n周");
System.out.println(cal.get(Calendar.DAY_OF_YEAR) + ":一年里的第n天");
System.out.println(cal.get(Calendar.HOUR) + ":12小时制");
System.out.println(cal.get(Calendar.HOUR_OF_DAY) + ":24小时制");
System.out.println(cal.get(Calendar.MINUTE) + ":分");
System.out.println(cal.get(Calendar.SECOND) + ":秒");
System.out.println(cal.get(Calendar.MILLISECOND) + ":毫秒");
// 闰年2月29的一年之后
cal.set(2000, 2 - 1, 29);
// 把日历转为日期
System.out.println(cal.getTime());
cal.add(Calendar.YEAR, 1);
System.out.println(cal.getTime());
}
}

*java8新增的time包

java.time,用于日期、时间处理

|--Clock类:获取指定时区的日期时间

|--Duration类:一段持续的时间

|--Instant类:具体时刻,精确到纳秒

|--LocalDate类:不带时区的时间

……

import java.time.*;
public class TestDateJava8 {
public static void main(String[] args) {
testClock();
testDuration();
testInstant();
testLocalDate();
}
static void testClock() {
System.out.println("---Clock类:获取指定时区的日期时间---");
Clock clock = Clock.systemUTC();// 世界统一时间
System.out.println("当前时刻为:" + clock.instant());
// millis()获取clock对应的毫秒数,与System.currentTimeMillis()输出相同
System.out.println(clock.millis() + ":clock.millis()");
System.out.println(System.currentTimeMillis() + ":System.currentTimeMillis()");
}
static void testDuration() {
System.out.println("---Duration类:一段持续的时间---");
int s = 60 * 59;// 60秒*59=59分钟
Duration d = Duration.ofSeconds(s);
System.out.println(s + "秒相当于" + d.toMinutes() + "分");
System.out.println(s + "秒相当于" + d.toHours() + "小时");
System.out.println(s + "秒相当于" + d.toDays() + "天");
}
static void testInstant() {
System.out.println("---Instant类:具体时刻,精确到纳秒---");
Instant instant = Instant.now();// 获取当前时间
System.out.println(instant + ":Instant.now() ");
Instant instant2 = instant.plusSeconds(6000);
System.out.println(instant2 + ":加时间plusSeconds()");
}
static void testLocalDate() {
System.out.println("---LocalDate类:不带时区的时间---");
LocalDate localDate = LocalDate.now();
System.out.println(localDate + ":LocalDate.now()");
// 获得某年的第几天
int _某一年 = 2017, _第几天 = 100;
localDate = LocalDate.ofYearDay(_某一年, _第几天);
System.out.println(localDate + ":" + _某一年 + "年,第" + _第几天 + "天LocalDate.ofYearDay()");
}
}