旧 API:位于 java.util 包中,里面主要有 Date、Calendar、TimeZone 类

新 API:位于 java.time 包中,里面主要有 LocalDateTime、ZonedDateTime、ZoneId 类

Date

public static void main( String[] args )
{
Date date = new Date();
System.out.println(date.getYear()+1900); // 2020
System.out.println(date.getMonth()+1); // 0~11
System.out.println(date.getDate()); // 9
System.out.println(date.toString()); // Mon Mar 09 15:33:13 CST 2020
System.out.println(date.toLocaleString()); // 2020-3-9 15:33:13
System.out.println(date.toGMTString()); // 9 Mar 2020 07:33:13 GMT
}

年从1900开始算;月分从0开始算,所以需要加1

缺点:

  1. 无法设置时区
  2. 无法加减日期
  3. 无法计算某天是星期几

eclipse在jdk1.8下,这些函数基本都带中划线,不建议使用了

SimpleDateFormat

为了能设置时区,有了SimpleDateFormat类

public static void main( String[] args )
{
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("y-M-d H:m:s"); // 2020-3-9 15:48:6
System.out.println(formatter.format(date));
formatter.setTimeZone(TimeZone.getTimeZone("GMT-8:00")); // 2020-3-8 23:48:6
System.out.println(formatter.format(date));
}

常用的格式化字符串:

y:年

M:月

d:日

H:小时

m:分钟

s:秒

S:毫秒

a:上午 / 下午

E:星期

z:时区

Calendar

为了加减日期,有了Calendar类

public static void main( String[] args )
{
Calendar c = Calendar.getInstance();
//c.set(Calendar.DAY_OF_WEEK, 1); // 这里设置后时间会自动变为当周日的年月日
int y = c.get(Calendar.YEAR); // 不比加1900
int M = c.get(Calendar.MONDAY) + 1; // 仍然用0~11表示1~12月份
int d = c.get(Calendar.DAY_OF_MONTH);
int H = c.get(Calendar.HOUR_OF_DAY);
int m = c.get(Calendar.MINUTE);
int s = c.get(Calendar.SECOND);
int S = c.get(Calendar.MILLISECOND);
int E = c.get(Calendar.DAY_OF_WEEK);
System.out.println(y + "-" + M + "-" + d + " " + H + ":" + m + ":" + s + "." + S + " " + E); // 加减功能
SimpleDateFormat formatter = new SimpleDateFormat("y-M-d h:m:s");
System.out.println(formatter.format(c.getTime()));
c.add(Calendar.DAY_OF_MONTH, 2); // 加2天
c.add(Calendar.MINUTE, -10); // 减10分钟
System.out.println(formatter.format(c.getTime())); // 时区功能
c.clear();
c.set(2020, 2, 9, 16, 0, 0); //这表月份要减一,3月份就是2
c.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println(c.getTime()); // Calendar获取Date时会转换成当地时区
}

LocalDateTime

public static void main( String[] args )
{
LocalDateTime dt = LocalDateTime.now();
// ISO 8601格式
// yyyy-MM-dd'T'HH:mm:ss.SSS
// 2020-03-09T16:23:47.667
System.out.println(dt); // 只需要Date或者Time
LocalDate d = dt.toLocalDate();
LocalTime t = dt.toLocalTime(); // 设置
// 1.parse符合IOS 8601字符串
dt = LocalDateTime.parse("2020-03-09T16:23:47.667");
System.out.println(dt); // 2.of设置
dt = LocalDateTime.of(2019, 1, 1, 8, 10, 0);
System.out.println(dt); // 3.单独设置,对比Calendar类的Set
LocalDateTime sdt = dt.withDayOfYear(6);
System.out.println(sdt); // 计算,和Calendar有点不同,LocalDateti不是原址改变的,dt仍然是原来值
LocalDateTime dt2 = dt.minusDays(1).plusHours(3);
System.out.println(dt + " " + dt2); }

ZonedDateTime

LocalDateTime总是当地时区,要对时区有操作可以使用ZonedDateTime

public static void main( String[] args )
{
// now获取当前时间
ZonedDateTime date = ZonedDateTime.now();
ZonedDateTime dateEST = ZonedDateTime.now(ZoneId.of("America/New_York")); // 该时区此刻时间 System.out.println(date); // 2020-03-09T16:43:22.830+08:00[Asia/Shanghai]
System.out.println(dateEST); // 2020-03-09T04:43:22.833-04:00[America/New_York] // LocalDateTime转成ZonedDateTime,只是加了个时区信息,本身时间没变
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/New_York"));
System.out.println(ldt); // 2020-03-09T16:55:13.556
System.out.println(zdt); // 2020-03-09T16:55:13.556-04:00[America/New_York] // ZonedDateTime转成LocalDateTime,简单丢弃时区信息
ldt = zdt.toLocalDateTime();
System.out.println(ldt); // 时区转换
ZonedDateTime zonedt = ZonedDateTime.of(2020, 1, 5, 10, 0, 0, 0, ZoneId.of("America/New_York"));
ZonedDateTime zonedt2 = zonedt.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
//2020-01-05T10:00-05:00[America/New_York] 2020-01-05T23:00+08:00[Asia/Shanghai]
System.out.println(zonedt + " " + zonedt2);
}

DateTimeFormatter

SimpleTimeFormat非线程安全,DateTimeFormatter线程安全

public static void main( String[] args )
{
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("y-MM-dd H:m:s");
System.out.println(dtf.format(LocalDateTime.now())); //自定义格式初始化LocalDateTime
LocalDateTime dt2 = LocalDateTime.parse("2020-01-01 10:14:43", dtf);
System.out.println(dt2);
}

Instant

Instant now = Instant.now();
System.out.println(now);
System.out.println(now.getEpochSecond()); // 秒为单位时间戳
System.out.println(now.toEpochMilli()); // 毫秒为单位时间戳 // 创建ZonedDateTime
now = Instant.ofEpochSecond(1583745633);
ZonedDateTime zdt = now.atZone(ZoneId.systemDefault());
System.out.println(zdt);

新旧API转换

// 旧转新
Instant now = new Date().toInstant();
ZonedDateTime zdt1 = ZonedDateTime.ofInstant(now, ZoneId.systemDefault());
ZonedDateTime zdt2 = now.atZone(ZoneId.systemDefault());
System.out.println(zdt1 + " " + zdt2); // 新转旧
Date d = new Date(zdt1.toEpochSecond()*1000);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(d));

Java中时间处理的更多相关文章

  1. java中时间的获取(二)

    java中时间的获取2 /** * 获取数据库操作记录时间 */ public static String getOpreateDbTime() { Calendar c = Calendar.get ...

  2. 【java】JDK1.8时间日期库 新特性 所有java中时间Date的使用

    除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用java 8的这套API.Java对日期, ...

  3. Java中时间格式处理,指定N天/小时等之后的时间

    1)根据当前时间,获取具体的时刻的时间 N天前 M小时之前 可用 new Date().getTime() - 24 * 60 * 60 * 1000*N[N天之前]的方法来获取处理时间之后的具体的值 ...

  4. Java中时间API使用详解

    目录 Java中时间API使用详解 1. 时区概念 2. 几种常见的时间 3. 时间戳 4. Java中的时间API 5. Java8中新添加的时间API 6. 在东八区的机器上获得美国时间 Java ...

  5. JAVA中时间格式转换

    1.将任意日期格式的字符串转换为指定格式的字符串 //默认格式 String s1 = "20190110133236"; //给定格式 String s2 = "201 ...

  6. Java中时间日期格式化

    1.与日期时间相关的类:      第一:java.util.Date;                           将时间作为一个整体使用.处理时,使用Date类较为简便      第二:j ...

  7. Java 中时间处理 System.currentTimeMillis()

    import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat ...

  8. Java中时间类中的Data类与Time类

    小简博客 - 小简的技术栈,专注Java及其他计算机技术.互联网技术教程 (ideaopen.cn) Data类 Data类中常用方法 boolean after(Date date) 若当调用此方法 ...

  9. java中时间类型的问题

    时间类型:System.currentTimeMillis() 获得的是自1970-1-01 00:00:00.000 到当前时刻的时间距离,类型为longimport java.sql.Date d ...

随机推荐

  1. 关于 conda中的 lxml 无法导入 etree 问题

    找到你conda的安装目录下\Lib\site-packages下的两个文件夹lxml和lxml-4.3.4.dist-info,将这两个文件夹删除. 执行命令pip install lxml 重新安 ...

  2. Istio 流量劫持过程

    开篇 Istio 流量劫持的文章其实目前可以在servicemesher社区找到一篇非常详细的文章,可查阅:Istio 中的 Sidecar 注入及透明流量劫持过程详解.特别是博主整理的那张" ...

  3. java1.8时间处理

    object TimeUtil { var DEFAULT_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") var H ...

  4. & vue项目中的rem适配

    有个朋友问我在vue项目怎么做rem适配,我工作中都是用的dva,但是我感觉道理都是一样的,换汤不换药.配完就顺手写下来吧! 需要安装两个插件库 lib-flexible和px2rem-loader ...

  5. 01 . 消息队列之(Kafka+ZooKeeper)

    消息队列简介 什么是消息队列? 首先,我们来看看什么是消息队列,维基百科里的解释翻译过来如下: 队列提供了一种异步通信协议,这意味着消息的发送者和接受者不需要同时与消息保持联系,发送者发送的消息会存储 ...

  6. Spring boot Sample 009之spring-boot-web-thymeleaf

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 spring boot 整合thymeleaf模板开发web项目 三.步骤 3.1.点击File -> New Pro ...

  7. Chisel3 - model - when

    https://mp.weixin.qq.com/s/YGTXky4wff7LXUphUxISQg   介绍创建模块判断逻辑的when命令.   1. when/elsewhen/otherwise ...

  8. JAVASE(十五) 泛型 :泛型用例、自定义泛型类、通配符

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.泛型在集合中的使用 1.1 在集合中使用泛型之前的例子 ​ 为什么要有泛型(Generic)? 1. ...

  9. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)

    765. 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...

  10. Java实现 蓝桥杯 算法提高 矩阵相乘

    算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也 ...