Java中时间处理
旧 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
缺点:
- 无法设置时区
- 无法加减日期
- 无法计算某天是星期几
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中时间处理的更多相关文章
- java中时间的获取(二)
java中时间的获取2 /** * 获取数据库操作记录时间 */ public static String getOpreateDbTime() { Calendar c = Calendar.get ...
- 【java】JDK1.8时间日期库 新特性 所有java中时间Date的使用
除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用java 8的这套API.Java对日期, ...
- Java中时间格式处理,指定N天/小时等之后的时间
1)根据当前时间,获取具体的时刻的时间 N天前 M小时之前 可用 new Date().getTime() - 24 * 60 * 60 * 1000*N[N天之前]的方法来获取处理时间之后的具体的值 ...
- Java中时间API使用详解
目录 Java中时间API使用详解 1. 时区概念 2. 几种常见的时间 3. 时间戳 4. Java中的时间API 5. Java8中新添加的时间API 6. 在东八区的机器上获得美国时间 Java ...
- JAVA中时间格式转换
1.将任意日期格式的字符串转换为指定格式的字符串 //默认格式 String s1 = "20190110133236"; //给定格式 String s2 = "201 ...
- Java中时间日期格式化
1.与日期时间相关的类: 第一:java.util.Date; 将时间作为一个整体使用.处理时,使用Date类较为简便 第二:j ...
- Java 中时间处理 System.currentTimeMillis()
import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat ...
- Java中时间类中的Data类与Time类
小简博客 - 小简的技术栈,专注Java及其他计算机技术.互联网技术教程 (ideaopen.cn) Data类 Data类中常用方法 boolean after(Date date) 若当调用此方法 ...
- java中时间类型的问题
时间类型:System.currentTimeMillis() 获得的是自1970-1-01 00:00:00.000 到当前时刻的时间距离,类型为longimport java.sql.Date d ...
随机推荐
- uiautomator2通过wifi操作手机
参考来源:https://www.cnblogs.com/c-x-a/p/11176066.html,有部分不适合当前版本的做了修改 1.手机通过USB连接电脑,先开启远程adb模式,操作如下(可以指 ...
- Spring笔记 - 组件注册
@Bean:类注入容器 xml方式: <bean id="person" class="com.hrh.bean.Person"> <prop ...
- ASP.NET Core Blazor Webassembly 之 组件
关于组件 现在前端几大轮子全面组件化.组件让我们可以对常用的功能进行封装,以便复用.组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件.它封装ht ...
- 彻底理解JavaScript ES6中的import和export
0.前言 前端工程,在最早的时候是没有模块的概念的.随着前端工程的发展,前端开发也越来越规范化,更像是软件工程了.那么随之而来的,为了解决工程化的问题,就引入了模块的概念.但是在早期,因为ecmasc ...
- Beta冲刺 —— 5.31
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.讨论并解决每个人存在的问 ...
- Rocket - util - Timer
https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A 简单介绍Timer的实现. 1. 基本功能 实现定时器的功能. 2. Ti ...
- jchdl - RTL Module
https://mp.weixin.qq.com/s/Sr4ffU4TPPoUJpdInwWd6w jchdl Module类在概念上对应Verilog的module,作为所有用户自定义模块的父 ...
- 09 . Nginx配置LNMP和LNMT架构
安装LNMP架构 环境清单 list CentOS7.3 proxysql-2.0.12-1-centos7.x86_64.rpm mysql-5.7.23-1.el7.x86_64.rpm-bund ...
- Debian安装无线网卡Ralink RL5390驱动
惠普一体机用的无线网卡是Ralink的 RL5390,安装Debian10以后没有驱动,网上下载firmware-misc-nonfree_20190114-2_all.deb 和firmware-r ...
- redis的持久化(RDB与AOF)
1.为什么redis要实现持久化? 避免因宕机.断电等场景导致进程退出后数据丢失,如果redis的数据都只存放于内存,那么进程退出后数据就丢失了.持久化机制可以持久化内存数据到硬盘,重启redis后基 ...