Java 处理时间 一般通过 Date、Calendar 获取 之后 进行 DateFormat、SimpleDateFormat 等 格式转换类 进行处理。
这里强调一点 日期:2021年2月22日,在我们编码过程中,一律写成 2021-02-22,不论月还是日的单位,必须是2位数,Mysql 的sql中一样需要这样写!!!
Date
Date时 JDK1.0的产品,易用性不是很好
案例
展示 当前时间 :星期 月 天 时 分 表 时区 年
@Test
public void newDate(){
System.out.println(new Date()); //Mon Feb 22 14:57:23 CST 2021
}
在时间戳 其实原点 加上 1000毫秒
@Test
public void newDateADD1000L(){
// 在 1970年 1月 1日 8 点 加上1000 毫秒
System.out.println(new Date(1000L)); //Thu Jan 01 08:00:01 CST 1970
}
下面代码 时间 都设置为了时区问题
关于 会变更的日期,请不要尝试 使用Date 切记
用起来 太繁琐,不如用 Calendar
- 第一点 getTime() 算的是时间原点 1970年 1月 1日 0时0分的时间
- new Date(year,month,day,hour,minute,second) 你添加的时间是 1899年 12月 31日 0点 0分 0秒 起步算的
@Test
public void newDateADDAnyYMD() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
System.out.println(simpleDateFormat.format(new Date(0, 0, 0, 0, 0, 0)));
//1899-12-31 星期日 00:00:00
System.out.println(simpleDateFormat.format(new Date(70, 0, 1, 0, 0, 0)));
//1970-01-01 星期四 00:00:00
}
Calendar类
Calendar 是通过getInstance 进行创建的,创建时 可以选择时区
@Test
public void CalendarDefultGMT(){
Calendar instance = Calendar.getInstance(); // 也是 获取当前时间
System.out.println("获取到的年是:"+instance.get(Calendar.YEAR));
System.out.println("获取到的月是:"+instance.get(Calendar.MONTH));
System.out.println("获取到的日是:"+instance.get(Calendar.DATE));
System.out.println("获取到的12小时制 时是:"+instance.get(Calendar.HOUR));
System.out.println("获取到的24小时制 时是:"+instance.get(Calendar.HOUR_OF_DAY));
System.out.println("获取到的分是:"+instance.get(Calendar.MINUTE));
System.out.println("获取到的秒是:"+instance.get(Calendar.SECOND));
System.out.println("获取到的星期是:"+(instance.get(Calendar.DAY_OF_WEEK)-1));
}
获取到的年是:2021
获取到的月是:1
获取到的日是:22
获取到的12小时制 时是:4
获取到的24小时制 时是:16
获取到的分是:59
获取到的秒是:29
获取到的星期是:1
根据GMT 设置时间 (中国是GMT+8)
@Test
public void CalendarSetGMT(){
Calendar instance = Calendar.getInstance(TimeZone.getTimeZone("GMT+0"));
System.out.println("获取到的年是:"+instance.get(Calendar.YEAR));
System.out.println("获取到的月是:"+instance.get(Calendar.MONTH));
System.out.println("获取到的日是:"+instance.get(Calendar.DATE));
System.out.println("获取到的12小时制 时是:"+instance.get(Calendar.HOUR));
System.out.println("获取到的24小时制 时是:"+instance.get(Calendar.HOUR_OF_DAY));
System.out.println("获取到的分是:"+instance.get(Calendar.MINUTE));
System.out.println("获取到的秒是:"+instance.get(Calendar.SECOND));
System.out.println("获取到的星期是:"+(instance.get(Calendar.DAY_OF_WEEK)-1));
}
获取到的年是:2021
获取到的年是:2021
获取到的月是:1
获取到的日是:22
获取到的12小时制 时是:9
获取到的24小时制 时是:9
获取到的分是:2
获取到的秒是:12
获取到的星期是:1
日历类,通常可以做 时间的转化:
获取当前时间,并在此基础上,加一个月,问是第一年的第几天
// 获取当前时间,并在此基础上,加一个月,问是第一年的第几天
@Test
public void CalendarOperate(){
Calendar instance = Calendar.getInstance();
System.out.println("当前时间是:"+instance.getTime());
System.out.println("当前是这一年的第:"+instance.get(Calendar.DAY_OF_YEAR)+" 天");
instance.add(Calendar.DATE,1);
System.out.println("处理后的时间是:"+instance.getTime());
System.out.println("当前是这一年的第:"+instance.get(Calendar.DAY_OF_YEAR)+" 天");
}
当前时间是:Mon Feb 22 17:14:09 CST 2021
当前是这一年的第:53 天
处理后的时间是:Tue Feb 23 17:14:09 CST 2021
当前是这一年的第:54 天
面试题:2020年 2月 多少天?
思路:利用日历类操作2020年3月1日减一天,然后获取当日在当月的第X天
// 问 2000 年 2月 多少天
@Test
public void Calendar2000FebsDays() throws ParseException {
Calendar instance = Calendar.getInstance();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = simpleDateFormat.parse("2000-03-01");
instance.setTime(parse);
instance.add(Calendar.DATE,-1);
System.out.println(instance.get(Calendar.DAY_OF_MONTH));
}
结果
29
上述 代码已经用过的 SimpleDateFormat 的方法了,这里 简单 讲一下
SimpleDateFormat 长用于处理 时间格式的转化
经常调用的有2个方法
- parse(String string) 转化为Date
- format(Date date) 转化为String
注意:使用parse将字符串转为日期存在线程安全问题,而使用format将日期转为字符串不存在线程安全问题。
解决线程安全问题,代码如下:
private static final ThreadLocal<SimpleDateFormat> dateFormatThreadLocal =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
// 使用
public static void formatDate() throws ParseException {
String time = "2020-01-01 11:11:11";
System.out.println("格式前:" + time); // 格式前:2020-01-01 11:11:11
SimpleDateFormat simpleDateFormat = dateFormatThreadLocal.get();
Date parse = simpleDateFormat.parse(time);
System.out.println("格式后:" + simpleDateFormat.format(parse)); // 格式后:2020-01-01
}
常用格式
24小时制 yyyy-MM-dd HH:mm:ss
12小时制 yyyy-MM-dd hh:mm:ss
转换的格式
字母 | 含义 | 示例 |
---|---|---|
y | 年份。一般用 yy 表示两位年份,yyyy 表示 4 位年份 | 使用 yy 表示的年扮,如 11; 使用 yyyy 表示的年份,如 2011 |
M | 月份。一般用 MM 表示月份,如果使用 MMM,则会 根据语言环境显示不同语言的月份 | 使用 MM 表示的月份,如 05; 使用 MMM 表示月份,在 Locale.CHINA 语言环境下,如“十月”;在 Locale.US 语言环境下,如 Oct |
d | 月份中的天数。一般用 dd 表示天数 | 使用 dd 表示的天数,如 10 |
D | 年份中的天数。表示当天是当年的第几天, 用 D 表示 | 使用 D 表示的年份中的天数,如 295 |
E | 星期几。用 E 表示,会根据语言环境的不同, 显示不 同语言的星期几 | 使用 E 表示星期几,在 Locale.CHINA 语 言环境下,如“星期四”;在 Locale.US 语 言环境下,如 Thu |
H | 一天中的小时数(0~23)。一般用 HH 表示小时数 | 使用 HH 表示的小时数,如 18 |
h | 一天中的小时数(1~12)。一般使用 hh 表示小时数 | 使用 hh 表示的小时数,如 10 (注意 10 有 可能是 10 点,也可能是 22 点) |
m | 分钟数。一般使用 mm 表示分钟数 | 使用 mm 表示的分钟数,如 29 |
s | 秒数。一般使用 ss 表示秒数 | 使用 ss 表示的秒数,如 38 |
S | 毫秒数。一般使用 SSS 表示毫秒数 | 使用 SSS 表示的毫秒数,如 156 |
案例
parse:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = simpleDateFormat.parse("2000-03-01");
format:
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = simpleDateFormat.format(date);
DateFormat
- SHORT 完全为数字,如 12.13.52 或 3:30pm
- MEDIUM 较长,如 Jan 12, 1952
- LONG 更长,如 January 12, 1952 或 3:30:32pm
- FULL 是完全指定,如 Tuesday、April 12、1952 AD 或 3:30:42pm PST。
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
评论(0)