一. Date
(一)说明
代表的是日期和时间
(二)常用的用法
构造器 | 说明 |
---|---|
public Date() | 创建一个Date对象,代表的是系统当前此刻日期时间 |
public Date(long time) | 把时间毫秒值转换成Date日期对象 |
常见方法 | 说明 |
---|---|
public long getTime() | 返回从1970年1月1日 00:00:00走到此刻的总的毫秒数 |
public void setTime(long time) | 设置日期对象的时间为当前时间毫秒值对应的时间 |
(三). 使用
1. 创建一个Date对象,代表系统当前的时间信息
public class Test {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);
}
}
2. 将毫秒值转换为日期
方法一:把时间毫秒转换成日期对象
//方法一:把时间毫秒转换成日期对象
Date d = new Date();
long time = d.getTime();
time += 2000;
Date d2 = new Date(time);
System.out.println(d2);
方法二:直接把日期对象的时间通过setTime方法进行修改
//方法二:直接把日期对象的时间通过setTime方法进行修改
Date d = new Date();
long time = d.getTime();
time += 2000;
Date d3 = new Date();
d3.setTime(time);
二. SimpleDateFormat
(一)说明
代表简单日期格式化,可以用来把日期对象,时间毫秒值格式化成我们想要的形式。
(二)常用的方法
常见构造器 | 说明 |
---|---|
public SimpleDateFormat(String pattern) | 创建简单日期格式化对象,并封装时间的格式 |
格式化时间的方法 | 说明 |
---|---|
public final String format(Date date) | 将日期格式化成日期/时间字符串 |
public final String format(Object time) | 将时间毫秒值格式化成日期/时间字符串 |
解析方法 | 说明 |
---|---|
public Date parse(String source) | 把字符串时间解析成日期对象 |
(三)规范
代码 | 说明 |
---|---|
G | 年代标志符 |
y | 年 |
M | 月 |
d | 日 |
h | 时 在上午或下午 (1~12) |
H | 时 在一天中 (0~23) |
m | 分 |
s | 秒 |
S | 毫秒 |
EEE | 星期几 |
D | 一年中的第几天 |
F | 一月中第几个星期几 |
w | 一年中第几个星期 |
W | 一月中第几个星期 |
a | 上午 / 下午 标记符 |
k | 时 在一天中 (1~24) |
K | 时 在上午或下午 (0~11) |
z | 时区 |
示例:
yyyy年MM月dd日 HH时mm分ss秒
yy/MM/dd HH:mm
yyyy-MM-dd HH:mm:ss
yyyy年MM月dd日 HH时mm分ss秒 E
一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区
(四)使用
1. 将某个时间转换为特定的格式
public class Main {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);
long time = d.getTime();
System.out.println(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE a");
System.out.println(sdf.format(d));
System.out.println(sdf.format(time));
}
}
在上面的例子中,format()即可以将Date类型的时间改为特定格式输出,也可以将毫秒值改为特定时间输出
2. SimpleDateFormat解析字符串时间成为日期对象
比如将2022-12-12 12:30:30这个字符串时间转换成 Date日期对象
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test2 {
public static void main(String[] args) throws ParseException {
String dateStr = "2022-12-12 12:12:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d2 = sdf.parse(dateStr);
System.out.println(d2);
}
}
在这里要注意的一点是,我们在创建SimpleDateFormat对象时,这个格式一定要和我们被解析的字符串的格式是一样的。
三. 练习(Date与SimpleDateFormat)
目标:通过例子进行练习,更好的掌握上述时间API的用法
名称:秒杀活动
需求:
已知秒杀开始时间:2023年11月11日 0:0:0
秒杀结束时间:2023年11月11日 0:10:0
- 小关下单并付款的时间为:2023年11月11日 0:01:18
- 小王下单并付款的时间为:2023年11月11日 0:10:51
- 请用代码说明这两位同学有没有参加以上秒杀活动?
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
//把时间拿出来
String start = "2023年11月11日 0:0:0";
String end = "2023年11月11日 0:10:0";
String xg = "2023年11月11日 0:01:18";
String xw = "2023年11月11日 0:10:57";
//把字符串的时间解析成日期对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date startDt = sdf.parse(start);
Date endDt = sdf.parse(end);
Date xgDt = sdf.parse(xg);
Date xwDt = sdf.parse(xw);
//开始判断小关和小王是否秒杀成功了
//获取Date对象的毫秒值
long startTime = startDt.getTime();
long endTime = endDt.getTime();
long xgTime = xgDt.getTime();
long xwTime = xwDt.getTime();
//判断
if (xgTime >= startTime && xgTime <= endTime) {
System.out.println("小关秒杀成功");
} else {
System.out.println("小关秒杀失败");
}
if (xwTime >= startTime && xwTime <= endTime) {
System.out.println("小王秒杀成功");
} else {
System.out.println("小王秒杀失败");
}
}
}
大致思路就是:
- 将字符串的时间转换成Date对象
- 通过Date类的getTime方法获取各自时间的毫秒值
- 通过毫秒值来判断
四. Calendar
(一)为什么要学习Calendar
例如,如果我们有这样一个需求:将2023年09年10日增加一个月。那么我们以传统的方法就需要以下的步骤:
- 定义字符串记住:2023年09年10日
- 将字符串时间解析成Date日期对象
- 通过日期对象获取毫秒值
- 增加一个月的毫秒值:1000*60*60*24*30
- 再格式化毫秒值得到结果
这样的步骤十分繁琐,那我们可以通过Canlendar来简化这一步骤
(二)说明
- 代表的是系统此刻时间对应的日历
- 通过它可以单独获取,修改时间中的年,月,日,时,分,秒等
(三)常用的方法
方法名 | 说明 |
---|---|
public static Calendar getInstance() | 获取当前日历对象 |
public int get(int field) | 获取日历中的某个信息 |
public final Date getTime() | 获取日期对象 |
public long getTimeInMillis() | 获取时间毫秒值 |
public void set(int filed,int value) | 修改日历中的某个信息 |
public void add(int filed,int amount) | 为某个信息增加/减少指定的值 |
(四)使用
注意:Calendar是可变对象,一旦修改后其对象本身表示的时间将产生变化。
1. 获取当前时间
public class Test {
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
System.out.println(now);
}
}
java.util.GregorianCalendar[time=1714620723281,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2024,MONTH=4,WEEK_OF_YEAR=18,WEEK_OF_MONTH=1,DAY_OF_MONTH=2,DAY_OF_YEAR=123,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=32,SECOND=3,MILLISECOND=281,ZONE_OFFSET=28800000,DST_OFFSET=0]
然后她就会返回我当前系统中的时间信息
注意:月份是从0开始记录的!
2. 获取日历中的某个信息
例如,获取年份:
int year = now.get(Calendar.YEAR);
获取在当年中的第几天
int Days = now.get(Calendar.DAY_OF_YEAR);
3. 拿到日历中记录的日期对象
Date d = now.getTime();
4. 拿到时间毫秒值
long time = now.getTimeInMillis();
5. 修改日期中的某个信息
now.set(Calendar.MONTH,9);
注意:月份是从0开始记录的!这里是将月份改为了10月,而非9月。
你也可以通过修改DAY_OF_YEAR来变相修改月份
例如将DAY_OF_YEAR修改为125,即修改成了今天是今年的第125天
6. 为某个信息增加或者减少多少
now.add(Calendar.DAY_OF_YEAR,100); //增加
now.add(Calendar.DAY_OF_YEAR,-100); //减少