旧 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. JavaScript的流程控制语句以及函数

    一.流程控制 1. 作用:控制代码的执行顺序 2. 分类 2.1顺序结构:从上到下依次执行代码语句 2.2选择结构: 1. if语句 简单if结构 if(条件表达式){ 表达式成立时执行的代码段 } ...

  2. DevOps知识点——3C知多少

    CI / CD是任何DevOps操作的两大基石,这是一种开发软件的方式,旨在生产快速而强大的软件,随时以可持续的方式发布更新. 当例行更改代码时,开发周期会更加频繁.更有意义且更快速.通过此过程,我们 ...

  3. hexo搭建个人网站及hexo+nginx部署个人网站

    先放个配置好了 server { # 监听端口 listen ; # 监听ip 换成服务器公网IP server_name mr-lin.site; location / { root /web/my ...

  4. CentOS8的网络管理变化

    资料来源: https://www.cnblogs.com/linuxandy/p/10839856.html 1.CentOS8使用NetworkManager.service(简称NM)来管理网络 ...

  5. JSON.parse() 的实现

    目录 1. JSON.parse() 2. 前置知识 2.1 JSON格式中的数据类型 2.2 转义字符的处理 2.2 判断对象是否相等 2.3 寻找匹配的字符串 2.4 基础的递归思想 3. 实现流 ...

  6. 实现一个 $attr(name,value) 遍历;属性为 name 值为 value 的元素集合

    <body> <div class="box clearfix"></div> <div name="zs">& ...

  7. Java实现 蓝桥杯VIP 算法训练 友好数

    有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的. 220的约数和有:1 2 4 5 ...

  8. java 实现 蓝桥杯 算法提高 排列数

    问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456789). 输入 ...

  9. java实现第五届蓝桥杯奇怪的分式

    奇怪的分式 题目描述 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批 ...

  10. Python之大数据库hive实战

    今天和大家分享的是Python如何连接hive数据库来进行hivesql的查询操作.   step1:环境准备 Python版本:3.6.2 Windows版本:Windows10版本的64位 ste ...