Java时间 日期 总结
获取当前时间
new Date()
Calendar calendar= Calendar.getInstance();
calendar.getTime()
LocalDateTime.now()
System.currentTimeMillis(); // 毫秒
Instant.now()
java.util.Date
Date对象里存的是自格林威治时间( GMT)1970年1月1日0点至Date对象所表示时刻所经过的毫秒数
Sysytem.out.println函数在打印时间时,会取操作系统当前所设置的时区,然后根据这个时区将同毫秒数解释成该时区的时间
new Date()
java.util.Calendar
Calendar类是抽象类型
Calendar cal = Calendar.getInstance();
// 获取年
int year = cal.get(Calendar.YEAR);
java.util.concurrent.TimeUnit
TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep()
java.text.SimpleDateFormat
String timeStr = "2017-8-24 11:17:10"; // 字面时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置北京时区
Date d = sdf.parse(timeStr);
System.out.println(sdf.format(d) + ", " + d.getTime());
输出:2017-08-24 11:17:10, 1503544630000
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G |
Era 标志符 | Text | AD |
y |
年 | Year | 1996 ; 96 |
M |
年中的月份 | Month | July ; Jul ; 07 |
w |
年中的周数 | Number | 27 |
W |
月份中的周数 | Number | 2 |
D |
年中的天数 | Number | 189 |
d |
月份中的天数 | Number | 10 |
F |
月份中的星期 | Number | 2 |
E |
星期中的天数 | Text | Tuesday ; Tue |
a |
Am/pm 标记 | Text | PM |
H |
一天中的小时数(0-23) | Number | 0 |
k |
一天中的小时数(1-24) | Number | 24 |
K |
am/pm 中的小时数(0-11) | Number | 0 |
h |
am/pm 中的小时数(1-12) | Number | 12 |
m |
小时中的分钟数 | Number | 30 |
s |
分钟中的秒数 | Number | 55 |
S |
毫秒数 | Number | 978 |
z |
时区 | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z |
时区 | RFC 822 time zone | -0800 |
日期和时间模式 | 结果 |
---|---|
"yyyy.MM.dd G 'at' HH:mm:ss z" |
2001.07.04 AD at 12:08:56 PDT |
"EEE, MMM d, ''yy" |
Wed, Jul 4, '01 |
"h:mm a" |
12:08 PM |
"hh 'o''clock' a, zzzz" |
12 o'clock PM, Pacific Daylight Time |
"K:mm a, z" |
0:08 PM, PDT |
"yyyyy.MMMMM.dd GGG hh:mm aaa" |
02001.July.04 AD 12:08 PM |
"EEE, d MMM yyyy HH:mm:ss Z" |
Wed, 4 Jul 2001 12:08:56 -0700 |
"yyMMddHHmmssZ" |
010704120856-0700 |
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" |
2001-07-04T12:08:56.235-0700 |
java.text.DateFormat
DateFormat df1 = DateFormat.getDateInstance();
DateFormat df2 = DateFormat.getDateTimeInstance();
DateFormat df3 = DateFormat.getTimeInstance();
java.time.Instant
精确到纳秒
Instant 代表的是一个时间,并不包括时区,1970年计算偏移量
实例不可变,可计算,可比较
Instant instant = Instant.now();
System.out.println(instant); # 2020-11-10T08:31:41.475Z
// 现在的时间上加上5个小时4分钟
Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4));
java.time.LocalTime
不带时区的日期
实例不可变,可计算,可比较
java.time.LocalDate
不带时区的日期
实例不可变,可计算,可比较
java.time.LocalDateTime
ISO-8601日历系统中没有时区的日期时间
实例不可变,可计算,可比较
LocalDateTime now = LocalDateTime.now();
now.isBefore();
now.isAfter();
now.format();
now.toLocalDate();
now.plusDays(1);//可能是负数
now.minusDays(1);
now.getDayOfWeek();
now.toEpochSecond(ZoneOffset.of("+8"));// 获取时间戳
时间戳
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
时间戳转时间
LocalDateTime localDateTime2 = Instant.now().atZone(ZoneId.systemDefault()).toLocalDateTime();
Instant.ofEpochSecond(100).atZone(ZoneId.systemDefault()).toLocalDateTime();
前台UI时间、Java程序时间、Mysql时间
java.sql.Date
java.sql.Time
java.sql.Timestamp
从数据库读取的时间,到了java客户端可能存在不同时间,这里就要设置mysql的时区 serverTimezone=Asia/Shanghai
Instant instant = Instant.parse("2017-05-24T07:56:22Z");
LocalTime localTime = instant.atZone(ZoneId.systemDefault()).toLocalTime();