时间格式的转化是一个比较常用到的知识点,在这里就进行整理记录一下
文章目录
- 1、由Date类型转化为指定的String类型
- 2、String类型转化为Date类型
- 3、Date类及相关方法
- 4、Calendar类及相关的方法
- 5、GregorianCalendar类
- 6、LocalDateTime类
- 7、本地时间与UTC(标准时间)之间的转换
1、由Date类型转化为指定的String类型
// Date格式转化为字符串
Date date = new Date();
System.out.println(date);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = dateFormat.format(date);
System.out.println(dateStr);
输出结果为:
Tue Nov 26 15:25:28 CST 2019
2019-11-26 15:25:28
2、String类型转化为Date类型
// 字符串转化为Date类型
String newDateStr = "2019年11月26日 15:24:30";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//此处的格式要与字符串格式一致
Date newDate = simpleDateFormat.parse(newDateStr);
System.out.println(newDate);
输出结果为:
Tue Nov 26 15:24:30 CST 2019
3、Date类及相关方法
创建当前时间:
Date date=new Date();
创建一个指定的时间(这种方法已经过期):
// example: 2019.12.11
Date date=new Date(2019-1900,12-1,11);
对于Date类型获取年、月、日的方法已经过期,这里就不再赘述。
日期的比较:
boolean after(Date date); // 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
boolean before(Date date);// 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
int compareTo(Date date);// 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
long getTime();// 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
4、Calendar类及相关的方法
由于Calendar类为一个抽象类,且构造函数为protected,所以Calendar不能够通过实例化的方式来获取对象,但是可以通过getInstance()方法来获取对象:
Calendar c = Calendar.getInstance();//默认是当前日期
创建一个指定日期的对象:
//创建一个代表2019年12月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2019, 12- 1, 12);
只设置年、月、日等中的某一项:
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.YEAR,2008); // 把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算
c1.set(Calendar.DATE,10); // 把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算
.......
Add方法:
Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DATE, 10);// 把c1对象的日期加上10,也就是c1也就表示为10天后的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, 10);// 把c1对象的日期减去10,也就是c1也就表示为10天前的日期,其它所有的数值会被重新计算
>其他字段属性的add的意义以此类推
5、GregorianCalendar类
GregorianCalendar类是Calendar类的具体实现,是Calendar类的一个子类;
常用方法:
GregorianCalendar();// 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
GregorianCalendar(int year, int month, int date);// 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar
GregorianCalendar(int year, int month, int date, int hour, int minute, int second);// 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar
GregorianCalendar(Locale aLocale);// 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar
GregorianCalendar(TimeZone zone);// 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。
GregorianCalendar(TimeZone zone, Locale aLocale);// 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。
void add(int field, int amount);
gregorianCalendar.add(GregorianCalendar.YEAR, 3); // 将gregorianCalendar对象代表的年份加上3
Date getTime();// 获取日历当前时间
int getMaximum(int field);//返回此 GregorianCalendar 实例的给定日历字段的最大值;example :2019返回9
void set(int year, int month, int date, int hour, int minute);// 设置年、月、日、小时、分钟的值。
boolean isLeapYear(int year);// 确定给定的年份是否为闰年。
long getTimeInMillis();// 获取用长整型表示的日历的当前时间
参考文章:Java 日期时间
6、LocalDateTime类
LocalDateTime与之前的日期类相比是线程安全的,是Java8的新特性,
常用方法:
public void testLocalDateTime(){
// 获取当前的日期时间
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间: " + currentTime);
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
System.out.println("date2: " + date2);
// 12 december 2014
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);
// 22 小时 15 分钟
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);
// 解析字符串
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println("date5: " + date5);
}
当前时间: 2016-04-15T16:55:48.668
date1: 2016-04-15
月: APRIL, 日: 15, 秒: 48
date2: 2012-04-10T16:55:48.668
date3: 2014-12-12
date4: 22:15
date5: 20:15:30
使用时区的日期API:
public void testZonedDateTime(){
// 获取当前时间日期
ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
System.out.println("date1: " + date1);
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("当期时区: " + currentZone);
}
date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai]
ZoneId: Europe/Paris
当期时区: Asia/Shanghai
其他方法:
LocalDateTime nowDate = LocalDateTime.now();
nowDate.plusHours(10);// 在当前时间基础上加上10个小时;年月日分秒与此类似
nowDate.toEpochSecond(ZoneOffset.ofHours(0));// 获取1970-01-01T00:00:00Z开始,当前时间对应的秒(s);ZoneOffset.ofHours(0)为设置偏移3个小时,即向后计算三个小时
参考文章:Java 8 日期时间 API
7、本地时间与UTC(标准时间)之间的转换
先来介绍本地时间转换为UTC时间:
public static Date localToUTC(Date date) {
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
// canculate ZONE_OFFSET
int zoneOffset=calendar.get(Calendar.ZONE_OFFSET);
// calculate DST_OFFSET
int dstOffset = calendar.get(java.util.Calendar.DST_OFFSET);
calendar.add(Calendar.MILLISECOND, -(zoneOffset+dstOffset));
return calendar.getTime();
}
由UTC的时间转换为本地时间,Date在UTC中没有时区和内部存储。只有在格式化日期时,时区更正才会应用。当使用DateFormat,它默认为它正在运行的JVM的时区,使用setTimeZone需要改变。
public static Date utcToLocal(Date date) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate=sdf.format(date);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utcDate = sdf.parse(formatDate);
sdf.setTimeZone(TimeZone.getDefault());
String localTime = sdf.format(utcDate.getTime());
return sdf.parse(localTime);
}