生产环境中,为了减少磁盘空间的使用,使用整型的数据存储时间,网上有一些使用的是timestamp进行做为中间值进行过渡,这样感觉不太合理,因为 timestamp 的最大时间是 到2038年,这样有可能会产生问题,另外一方面可能还没发展到2038年,写的代码早就被更新迭代掉了,实际影响不是很大
/**
* date 转 integer
* @param date
* @return
*/
public static Integer dateToInteger(Date date) {
return (int) (date.getTime() / 1000);
}
/**
* integer 转 date
* @param integer
* @return
*/
public static Date integerToDate(Integer integer) {
return new Date(integer*1000L);
}
时间类型转换。
############################################################
//尽量避免使用这种方式获得 Instant 时间,2020-03-21T15:14:42.071 直接获得本地时间,表示的是 带T 的本地时间,格式是国际时间,时间不是
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("---------localDateTime------------>" + localDateTime);
############################################################
String <-----> Date <-----> Instant
三种时间类型直之间的相互转换
/**
* 时间转换
* String <--> date <--> instant
* @author y_zzu 2020-03-21-14:48
*/
public class TimeUtils {
/**
* 将时间字符串 转换为Instant 国际时间
* @param string 时间
* @return Instant
*/
public static final Instant StringToInstant(String string) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//将 string 装换成带有 T 的国际时间,但是没有进行,时区的转换,即没有将时间转为国际时间,只是格式转为国际时间
LocalDateTime parse = LocalDateTime.parse(string, dateTimeFormatter);
//+8 小时,offset 可以理解为时间偏移量
ZoneOffset offset = OffsetDateTime.now().getOffset();
//转换为 通过时间偏移量将 string -8小时 变为 国际时间,因为亚洲上海是8时区
Instant instant = parse.toInstant(offset);
return instant;
}
/**
* String ---> date---> Instant
* @param s 2020-03-21 17:23:54
* @return 2020-03-21T09:23:54Z
* @throws ParseException 抛出异常
*/
public static final Instant StringToDateToInstant(String s) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dateFormat.parse(s);
Instant instant = date.toInstant();
return instant;
}
/**
* instant 转成 String
* @param instant 国际时间
* @return
*/
public static final String InstantToDateToString(Instant instant) {
//将 instant 转成 date
Date from = Date.from(instant);
//将 date 转成 string,调用上面的方法
String string = DateToString(from);
/*
//或者使用这两句
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = dateFormat.format(date);*/
return string;
}
/**
* date ---> instant
* @param date
* @return
*/
public static final Instant DateToInstant(Date date) {
Instant instant = date.toInstant();
return instant;
}
/**
* instant ---> date
* @param instant
* @return
*/
public static final Date InstantToDate(Instant instant) {
Date from = Date.from(instant);
return from;
}
/**
* String ---> date
* @param s 2020-03-21 17:23:54
* @return Sat Mar 21 17:23:54 CST 2020
* @throws ParseException
*/
public static final Date StringToDate(String s) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dateFormat.parse(s);
return date;
}
/**
* date格式时间 转换为字符串
* @param date 时间
* @return
*/
public static final String DateToString(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = dateFormat.format(date);
return string;
}
/**
* 测试主方法
* @param args
*/
public static void main(String args[]) throws ParseException {
String stringtime = "2020-03-21 14:53:42";
Instant instantStringtime = StringToInstant(stringtime);
System.out.println("-----------StringToInstant------------->" + stringtime);
System.out.println("-----------StringToInstant------------->" + instantStringtime);
String s = "2020-03-21 17:23:54";
System.out.println("---------StringToDateToInstant-------->" + s);
Instant instant1 = StringToDateToInstant(s);
System.out.println("---------StringToDateToInstant-------->" + instant1);
//推荐使用这种方式获得 Instant 时间,获得当前的国际时间,instant,020-03-21T07:14:42.071Z
Instant instant = Instant.now();
System.out.println("---------InstantToDateToString------------>" + instant);
String instantToString = InstantToDateToString(instant);
System.out.println("---------InstantToDateToString------------>" + instantToString);
Date date = new Date();
System.out.println("-------------DateToInstant---------------->" + date);
Instant instant2 = DateToInstant(date);
System.out.println("-------------DateToInstant---------------->" + instant2);
Instant instant3 = Instant.now();
System.out.println("---------InstantToDate--------->" + instant3);
Date date2 = InstantToDate(instant3);
System.out.println("---------InstantToDate--------->" + date2);
String s1 = "2020-03-21 17:45:55";
System.out.println("-----------StringToDate----------->" + s1);
Date date1 = StringToDate(s1);
System.out.println("-----------StringToDate----------->" + date1);
//获得 Sat Mar 21 15:12:26 CST 2020 英文字母的时间
Date date3 = new Date();
System.out.println("----------DateToString----------->" + date3);
String sdate = DateToString(date3);
System.out.println("----------DateToString----------->" + sdate);
//尽量避免使用这种方式获得 Instant 时间,2020-03-21T15:14:42.071 直接获得本地时间,表示的是 带T 的本地时间,格式是国际时间,时间不是
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("---------localDateTime------------>" + localDateTime);
}
}
如果数据库里存储的时间类型是 Instant 类型,
存储的时候可能会相差8个小时,这个时候,不要手动的进行8小时时差的添加,修改 properties 配置文件
指定当前时区为 Asia/Shanghai
由于我开发的时候使用的是 Hibernate 对数据库进行操作 ,配置文件为
spring.jsp.properties.hibernate.jdbc.time_zone=Asia/Shanghai
-----------StringToInstant------------->2020-03-21 14:53:42 String类型的时间
-----------StringToInstant------------->2020-03-21T06:53:42Z Instant类型的时间
---------StringToDateToInstant-------->2020-03-21 17:23:54
---------StringToDateToInstant-------->2020-03-21T09:23:54Z
---------InstantToDateToString------------>2020-03-21T11:21:19.146Z
---------InstantToDateToString------------>2020-03-21 19:21:19
-------------DateToInstant---------------->Sat Mar 21 19:21:19 CST 2020 Date类型的时间
-------------DateToInstant---------------->2020-03-21T11:21:19.147Z
---------InstantToDate--------->2020-03-21T11:21:19.152Z
---------InstantToDate--------->Sat Mar 21 19:21:19 CST 2020
-----------StringToDate----------->2020-03-21 17:45:55
-----------StringToDate----------->Sat Mar 21 17:45:55 CST 2020
----------DateToString----------->Sat Mar 21 19:21:19 CST 2020
----------DateToString----------->2020-03-21 19:21:19
---------localDateTime------------>2020-03-21T19:21:19.153 不要使用这种时间