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 ...
随机推荐
- android小Demo--圆球跟随手指轨迹移动
eatwhatApp的客户端基本实现,会再后续进行整改,今天做一个在网上找到的小Demo,让屏幕中出现一个圆球,并跟随手指移动. 写个java类DrawView继承于View: public clas ...
- pandas DataFrame 的横向纵向拼接组合
concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat( ...
- nodejs安装及环境变量的配置
首先,nodejs安装到C盘的 建议安装到其他盘里,这是为了防止电脑出故障后C盘下载的东西会缺失 第一次安装nodejs的,第一步打开“nodejs官网:https://nodejs.org/zh-c ...
- ISTQB认证测试工程师基础大纲(2019.12.25)
1.本文档目的: 用于生成认证测试员基础级考试题. 本大纲中除了简介和附录外,考核通常包含了所有K1级别的内容,因此,应试者可能会被考到本大纲中要求识别,牢记,或记忆的关键词或概念.在本大纲中,每章开 ...
- 50个SQL语句(MySQL版) 问题三
--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...
- Hystrix微服务容错处理及回调方法源码分析
前言 在 SpringCloud 微服务项目中,我们有了 Eureka 做服务的注册中心,进行服务的注册于发现和服务治理.使得我们可以摒弃硬编码式的 ip:端口 + 映射路径 来发送请求.我们有了 F ...
- Rocket - diplomacy - enumerateMask
https://mp.weixin.qq.com/s/s3hr5JJX2_pwNgdu8WqV0Q 介绍enumerateMask的实现.(仅供理解,非严谨证明) 1. 基本定义 ...
- ansible取出register变量中最长字符串
背景 在用ansible撰写一个etcd恢复的playbook时,有一个操作是获取etcd启动时的"initial-cluster"启动参数,该参数在etcd集群不同节点不一致,需 ...
- Java实现 LeetCode 740 删除与获得点数(递推 || 动态规划?打家劫舍Ⅳ)
740. 删除与获得点数 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除每个等于 nums[ ...
- Java实现 蓝桥杯 算法训练 乘法次数
乘法次数 资源限制 时间限制:1.0s 内存限制:999.4MB 问题描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:22=22(第一次乘),2 ...