Java基础|关于时间的 API 不可不知

(推荐使用Java8新的时间API)

1 Java 8 java.time.* 下面的常用API

DateTimeFormatter
LocalDate
LocalDateTime
LocalTime
Clock
MonthDay
YearMonth

2 Java 8 时间 API 优点

  • 线程安全 java.time 包下的所有类都是不可变类型且线程安全。老的时间 API,java.util.Date 为可变类型,以及 SimpleDateFormat 为非线程安全使其应用非常受限。

  • 格式化便捷 DateTimeFormatter 类用来格式化和解析时间,线程安全。不用再依赖 Joda Time 等第三方库。

  • 判断闰年 LocalDate 类有一个很实用的方法 isLeapYear() 判断该实例是否是一个闰年。

  • 时间戳 增加了一个 Clock 时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到 System.currentTimeInMillis()TimeZone.getDefault() 的地方都可用 Clock 替换。

3 示例代码

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import org.junit.Test;

/**
 * @version $Id: JavaTime.java, v 0.1 2017年7月30日 上午10:11:14
 */
public class JavaTime {
	@Test
	public void test() {
		System.out.println("/************************************************************************************/");
		/************************************************************************************/
		// LocalDate;LocalTime;LocalDateTime 得到时间对象的一组方法,LocalDateTime最后一位是纳秒,1秒=1000
		// 000 000纳秒
		System.out.println("获取时间:");
		System.out.println("LocalDateTime.now()-->" + LocalDateTime.now());
		System.out.println("LocalDate.now()-->" + LocalDate.now());
		System.out.println("LocalTime.now()-->" + LocalTime.now());
		// 也都有of()方法,都有多个重载,灵活使用
		System.out.println("LocalDate.of(2017,05,10)-->" + LocalDate.of(2017, 05, 10));
		System.out.println("LocalTime.of(2017,05,10,22,33,44,1000)-->" + LocalTime.of(22, 33, 44, 1000));
		System.out.println(
				"LocalDateTime.of(2017,05,10,22,33,44,1000)-->" + LocalDateTime.of(2017, 05, 10, 22, 33, 44, 1000));
		// 可获取年,月,日,时,分,秒,纳秒
		System.out.println("LocalDateTime.now()-->" + LocalDateTime.now());
		System.out.println("LocalDateTime.now().getYear()-->" + LocalDateTime.now().getYear());
		System.out.println("LocalDateTime.now().getMonthValue()-->" + LocalDateTime.now().getMonthValue());
		System.out.println("LocalDateTime.now().getDayOfMonth()-->" + LocalDateTime.now().getDayOfMonth());
		System.out.println("LocalDateTime.now().getHour()-->" + LocalDateTime.now().getHour());
		System.out.println("LocalDateTime.now().getMinute()-->" + LocalDateTime.now().getMinute());
		System.out.println("LocalDateTime.now().getSecond()-->" + LocalDateTime.now().getSecond());
		System.out.println("LocalDateTime.now().getNano()-->" + LocalDateTime.now().getNano());
		System.out.println("/************************************************************************************/");
		/************************************************************************************/
		System.out.println("解析时间1:(去掉纳秒,秒等)");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("localDateTime-->" + localDateTime);
		System.out.println("localDateTime.withNano(0)-->" + localDateTime.withNano(0));
		System.out.println("localDateTime.withSecond(0)-->" + localDateTime.withSecond(0));
		System.out.println("localDateTime.withSecond(0)..withNano(0)-->" + localDateTime.withSecond(0).withNano(0));
		try {
			System.out
					.println("/************************************************************************************/");
			/************************************************************************************/
			// 一般使用自定义的格式来达到(字符串->时间)(时间->字符串),更加方便灵活
			System.out.println("格式化和解析时间2:(时间->字符串)");
			DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
			System.out.println("格式化为" + "yyyy-MM-dd hh:mm:ss-->" + LocalDateTime.now().format(format));
			System.out
					.println("/************************************************************************************/");
			/************************************************************************************/
			System.out.println("格式化和解析时间3:(字符串->时间)||可一次指定多格式字符串");
			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy/MM/dd HH:mm:ss.SSSSSS]"
					+ "[yyyy-MM-dd HH:mm:ss]" + "[dd-MM-yyyy HH:mm:ss]" + "[ddMMyyyy HH:mm:ss]");
			System.out.println("[示例]指定可匹配的多格式:" + "[yyyy/MM/dd HH:mm:ss.SSSSSS]" + "[yyyy-MM-dd HH:mm:ss]"
					+ "[dd-MM-yyyy HH:mm:ss]" + "[ddMMyyyy HH:mm:ss]");
			System.out.println(LocalDateTime.parse("2016/03/23 22:33:44.256145", formatter));
			System.out.println(LocalDateTime.parse("2016-03-23 22:33:44", formatter));
			System.out.println(LocalDateTime.parse("23-05-2016 22:33:44", formatter));
			System.out.println(LocalDateTime.parse("23052016 22:33:44", formatter));
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

结果:

/************************************************************************************/
获取时间:
LocalDateTime.now()-->2017-07-30T15:24:23.841
LocalDate.now()-->2017-07-30
LocalTime.now()-->15:24:23.841
LocalDate.of(2017,05,10)-->2017-05-10
LocalTime.of(2017,05,10,22,33,44,1000)-->22:33:44.000001
LocalDateTime.of(2017,05,10,22,33,44,1000)-->2017-05-10T22:33:44.000001
LocalDateTime.now()-->2017-07-30T15:24:23.842
LocalDateTime.now().getYear()-->2017
LocalDateTime.now().getMonthValue()-->7
LocalDateTime.now().getDayOfMonth()-->30
LocalDateTime.now().getHour()-->15
LocalDateTime.now().getMinute()-->24
LocalDateTime.now().getSecond()-->23
LocalDateTime.now().getNano()-->842000000
/************************************************************************************/
解析时间1(去掉纳秒,秒等)
localDateTime-->2017-07-30T15:24:23.842
localDateTime.withNano(0)-->2017-07-30T15:24:23
localDateTime.withSecond(0)-->2017-07-30T15:24:00.842
localDateTime.withSecond(0)..withNano(0)-->2017-07-30T15:24
/************************************************************************************/
格式化和解析时间2(时间->字符串)
格式化为yyyy-MM-dd hh:mm:ss-->2017-07-30 03:24:23
/************************************************************************************/
格式化和解析时间3(字符串->时间)||可一次指定多格式字符串
[示例]指定可匹配的多格式:[yyyy/MM/dd HH:mm:ss.SSSSSS][yyyy-MM-dd HH:mm:ss][dd-MM-yyyy HH:mm:ss][ddMMyyyy HH:mm:ss]
2016-03-23T22:33:44.256145
2016-03-23T22:33:44
2016-05-23T22:33:44
2016-05-23T22:33:44

4 Java 老的时间 API 总结

这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不甩锅的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值