Java中时间转换常用方法

  1. 获得某天最大时间 2017-10-15 23:59:59
  2. 获得某天最小时间 2017-10-15 00:00:00
  3. 时间戳转Date
  4. Date转时间戳
  5. 格式化Date
  6. 给日期加上指定时长
  7. 得到指定时间节点的日期时间
  8. 判断两个时间点是否为同一天、同一年
  9. Java 8 日期时间 API
【Java中时间转换常用方法】
// 1获得某天最大时间 2017-10-15 23:59:59 public static Date getEndOfDay(Date date) { LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()),ZoneId.systemDefault()); ; LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX); return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()); } // 2获得某天最小时间 2017-10-15 00:00:00 public static Date getStartOfDay(Date date) { LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault()); LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN); return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); } **测试代码** public static void main(String[] args) { Date date = new Date(); System.out.println("今天开始时间:" + getStartOfDay(date)); System.out.println("今天结束时间:" + getEndOfDay(date)); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(getStartOfDay(date))); System.out.println(sdf.format(getEndOfDay(date))); } *运行结果* 结果输出如下:

Java中时间转换常用方法
文章图片

声明式时间格式化
private static String Date_Format_Patten = “yyyy-MM-dd HH:mm:ss”;
DateUtil.stringToDate(interviewTime,Date_Format_Patten);
3、时间戳转Date
注:以下的方法中很多常量和方法我都没有提取出来,正式项目中还是建议大家封装在时间处理类中,规范化操作
public static void main(String[] args) { // 10位的秒级别的时间戳 long time1 = 1527767665; String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000)); System.out.println("10位数的时间戳(秒)--->Date:" + result1); Date date1 = new Date(time1*1000); //对应的就是时间戳对应的Date // 13位的秒级别的时间戳 double time2 = 1515730332000d; String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2); System.out.println("13位数的时间戳(毫秒)--->Date:" + result2); }

执行结果
10位数的时间戳(秒)--->Date:2018-05-31 19:54:25 13位数的时间戳(毫秒)--->Date:2018-01-12 12:12:12

尤其要注意上面10位的秒级别的时间戳时,不能用int来定义time1变量,否则会得到错误的结果:
public static void main(String[] args) { // 10位的秒级别的时间戳 int time1 = 1527767665; //错误做法 String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000)); System.out.println("10位数的时间戳(秒)--->Date:" + result1); }

执行出的错误结果
10位数的时间戳(秒)--->Date:1969-12-17 23:21:47

4、Date转时间戳
public static void main(String[] args) { //获取指定时间的时间戳,除以1000说明得到的是秒级别的时间戳(10位) long time = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse("2018-06-30 20:00:00", new ParsePosition(0)).getTime() / 1000; //获取时间戳 long now1 = System.currentTimeMillis(); long now2 = new Date().getTime(); System.out.println("获取指定时间的时间戳:" + time); System.out.println("当前时间戳:" +now1); System.out.println("当前时间戳:" +now2); }

执行结果
获取指定时间的时间戳:1530360000 当前时间戳:1527769494340 当前时间戳:1527769494340

5、格式化Date
public static void main(String[] args) { //使用common-lang包下面的DateFormatUtils类 String format1 = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); //使用最原始的SimpleDateFormat类 String format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); System.out.println("格式化时间1:" + format1); System.out.println("格式化时间2:" + format2); }

执行结果
格式化时间1:2018-05-31 20:26:49 格式化时间2:2018-05-31 20:26:49

DateFormatUtils是commons.lang3.time.DateFormatUtils下的,如果你的项目中没有,maven中引入下:
org.apache.commons commons-lang3 3.6

6、给日期加上指定时长
比如,给现在的时间加上12个小时,这个需求也很常见,例如我做过的某个秒杀接口要返回剩余秒杀时间给前端,那么我就直接计算(比如秒杀持续时间为12小时):秒杀(倒计时)截止时间=(当前时间+12H)即可。
public static void main(String[] args) { //将指定日期加上固定时间,DateUtils还有其它添加分钟、小时、月份之类的方法api //使用到的是commons-lang包下面的DateUitls类 Date date = DateUtils.addDays(new Date(), 10); // System.out.println("当前时间为:"+DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")); String format = DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss"); System.out.println("当前时间加上10天后:" + format); }

执行结果
当前时间为:2018-05-31 20:31:53 当前时间加上10天后:2018-06-10 20:31:53

DateUtils也是commons.lang3.time包下的,别忘了加maven依赖。
7、得到指定时间节点的日期时间
public static void main(String[] args) throws ParseException { //得到指定日期 String date = "2018-03-03 15:20:12"; Date parse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date); System.out.println(parse); }

8、判断两个时间点是否为同一天、同一年
给定两个日期,快速判断两者是否为同一天或者同一年,比如我做过的一个接口需求是:每人每天有一次抽奖机会,那么当用户当天第二次发送请求时候,我就得判断查询参与记录,并且判断最新一次参与时间和当天是否为同一天。
/** * 判断是否为同一天:使用commons-lang包下的DateUtils类 * * @param day1 * @param day2 * @return */ public boolean isSameDay(Date day1, Date day2) { return DateUtils.isSameDay(day1, day2); } /** * 判断是否为同一天:使用joda依赖包里的时间类,效率从一定程度上优于DateUtils.isSameDay()方法 * * @param date1 * @param date2 * @return */ public static boolean isSameDay1(Date date1,Date date2){ if(date1==null || date2==null){ throw new IllegalArgumentException("date must be not null"); } LocalDate localDate1 = new LocalDate(new DateTime(date1.getTime())); LocalDate localDate2 = new LocalDate(new DateTime(date2.getTime())); return localDate1.equals(localDate2); }

9、Java 8 日期时间 API Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
Local(本地) ? 简化了日期时间的处理,没有时区的问题。
Zoned(时区) ? 通过制定的时区处理日期时间。
本地化日期时间 API
LocalDate/LocalTime 和 LocalDateTime 类可以在处理时区不是必须的情况。代码如下:
import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.Month; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testLocalDateTime(); }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); //获取当前年 Calendar calendar = Calendar.getInstance(); int yearNow = calendar.get(Calendar.YEAR); System.out.println("date6: " + yearNow ); } }

执行以上脚本,输出结果为:
$ javac Java8Tester.java $ java Java8Tester 当前时间: 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 date6:2018

使用时区的日期时间API
如果我们需要考虑到时区,就可以使用时区的日期时间API:
import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); }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); } }

执行以上脚本,输出结果为:
$ javac Java8Tester.java $ java Java8Tester date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai] ZoneId: Europe/Paris 当期时区: Asia/Shanghai

    推荐阅读