Date可以表示一个特定的瞬间,精确到毫秒
DateFormat,SimpleDateFormat 类 时间格式化类
import java.util.Date;
public class Demo {
public static void main(String[] args) {
Date date = new Date();
//date对象获取是当前的时间Wed Apr 03 23:18:01 CST 2019
System.out.println(date);
//返回以毫秒为单位的当前时间(当前时间 - 1970.1.1 午夜)
long now = System.currentTimeMillis();
//转换为当前时间
Date date2 = new Date(now);
System.out.println(date2);
System.out.println(date2.getTime());
System.out.println("中国风格的时间:"+date2.toLocaleString());
}
}
运行结果:
通常很多人都习惯使用new Date()来获取当前时间。new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date(),效率上会高一点。
//Date源码:
public Date() {
this(System.currentTimeMillis());
}
DateFormat转换的格式是固定的,以与语言无关的方式格式化并解析日期或时间,根据需求定制时间DataFormat是无法完成的。
SimpleDateFormat:DataFormat的子类,可以自定义时间规则。
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws ParseException {
Date d = new Date();
System.out.println(d);//当前时间
//格式化操作: Date类型转换为String字符串
DateFormat df = DateFormat.getInstance();// SHORT风格(短)
String time = df.format(d);
System.out.println(time);
//LONG风格
df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
System.out.println(df.format(d));
//解析 String类型的时间 --> date对象
df = DateFormat.getInstance();
time = df.format(d);
Date d2 = df.parse(time);//从给定字符串的开始解析文本,以生成一个日期
System.out.println(d2);
}
}
运行结果:
以与语言环境有关的方式来格式化和解析日期的具体类,它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws ParseException {
//给定一个时间的格式
String pattern = "yyyy-MM-dd HH:mm:ss";
//这个构造方法是有一个有参类型,可以直接传入格式
SimpleDateFormat sdf = new SimpleDateFormat();
//需要确定使用格式
sdf.applyPattern(pattern);
//等价于SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格式化时间
String time = sdf.format(new Date());
System.out.println(time);
//解析 使用了什么风格格式化,就必须使用相同风格解析(使用同一个对象操作即可)
Date date = sdf.parse(time);
System.out.println(date);
}
}
运行结果:
Calendar是一个日历类用来代替Date使用的
Calendar类是一个抽象类,为一个特定的瞬间和一套 calendar fields 如 YEAR, MONTH, DAY_OF_MONTH, HOUR
之间的转换提供了方法
获取日历类对象 getInstance();获取的是默认时区对应的语言环境的一个日历对象
import java.text.ParseException;
import java.util.Calendar;
public class Demo {
public static void main(String[] args) throws ParseException {
// 获取当前时间
Calendar calendar = Calendar.getInstance();
//不能直接打印:System.out.println(calendar);
//java.util.GregorianCalendar[time=1553054809390,areFieldsSet=true,areAllFieldsSet=true,
//lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,
//dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,
//minimDAY_alDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=2,WEEK_OF_YEAR=12,
//WEEK_OF_MONTH=4,OF_MONTH=20,DAY_OF_YEAR=79,DAY_OF_WEEK=4,
//DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=6,
//SECOND=49,MILLISECOND=390,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.out.println("当前系统时间:");
//获取年
int year = calendar.get(Calendar.YEAR);
//月
int month = calendar.get(Calendar.MONTH);//此处的月需要+1
//日期
int day = calendar.get(Calendar.DATE);
//小时 二十四小时
int hour = calendar.get(Calendar.HOUR_OF_DAY);
//分钟
int minute = calendar.get(Calendar.MINUTE);
//秒
int second = calendar.get(Calendar.SECOND);
String time = year+"年"+(month+1)+"月"+day+"日"+" "+hour+"小时"+minute+"分钟"+second+"秒";
System.out.println(time);
}
}
运行结果:
import java.util.Calendar;
public class Demo1 {
public static void main(String[] args) {
//获取2019年3月20日 是这一年的第几天, 第几周, 一个月中第几天
Calendar c = Calendar.getInstance();
/*
* c.set(c.YEAR, 2019);设置时间使用set
* 第一个是定义的属性,第二个是时间
*/
//month 是从0开始到11结束 当前月份-1 才能获取对应的月份
c.set(2019, 2, 20);
int dayInYear = c.get(Calendar.DAY_OF_YEAR);//天数
int weekInYear = c.get(Calendar.WEEK_OF_YEAR);//周数
int dayInMonth = c.get(Calendar.DAY_OF_MONTH);//月中的天数
String time = "这一年的第"+dayInYear+"天,第"
+weekInYear+"周,这一月的第"+dayInMonth+"天";
System.out.println(time);
}
}
运行结果:
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:
Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Callable task = new Callable() {
@Override
public Date call() throws Exception {
return sdf.parse(sdf.format(new Date()));
}
};
//线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Future submit = pool.submit(task);
results.add(submit);
}
for (Future future : results) {
try {
System.out.println(future.get().toLocaleString());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
pool.shutdown();
}
运行结果(此演示基于Date的可变性):
加锁后:
@Override
public Date call() throws Exception {
synchronized (this) {
return sdf.parse(sdf.format(new Date()));
}
}
运行结果:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Demo1 {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Callable task = new Callable() {
@Override
public LocalDate call() throws Exception {
return LocalDate.parse("2019-04-07", formatter);
}
};
//线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Future submit = pool.submit(task);
results.add(submit);
}
for (Future future : results) {
try {
System.out.println(future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
pool.shutdown();
}
}
运行结果:
LocalDate/LocalTime 和 LocalDateTime 类可以处理时区不是必须的情况。
LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
LocalDateTime 既包含日期,又包含时间,而且与1970无关。(好用!!!)
import java.time.LocalDateTime;
public class Demo1 {
public static void main(String[] args) {
//当前时间
LocalDateTime ldt=LocalDateTime.now();
System.out.println("当前时间"+ldt);
//其他时间
LocalDateTime ldt2=LocalDateTime.of(2012, 10, 1, 10, 10, 10);
System.out.println("其他时间:"+ldt2);
//加时间
LocalDateTime ldt3=ldt2.plusDays(2);
System.out.println("加时间:"+ldt3);
//减时间
LocalDateTime ldt4 = ldt3.minusHours(2);
System.out.println("减时间:"+ldt4);
//获取时间部分
System.out.println(ldt.getYear());
System.out.println(ldt.getMonthValue());
System.out.println(ldt.getDayOfMonth());
System.out.println(ldt.getHour());
System.out.println(ldt.getMinute());
System.out.println(ldt.getSecond());
}
}
运行结果:
Instant 时间戳:它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经历的描述进行运算
ZoneId 时区
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Set;
public class Demo3 {
public static void main(String[] args) {
//Instant
System.out.println("----------------Instant--------------");
Instant insNow = Instant.now();
System.out.println("现在的时间:"+insNow.toString());
//from the epochof 1970-01-01T00:00:00Z
System.out.println("现在的时间距-过去多少秒:"+insNow.toEpochMilli());
//Instant相当于之前的Date,也是毫秒数
Instant instant = Instant.ofEpochMilli(1554629143473L);
System.out.println("秒转时间:"+instant);
//Duration:计算时间差
long diff = Duration.between(instant, insNow).toMillis();
System.out.println("时间差:"+diff);
//Instant <--> Date
Date date = new Date();
//Instant转Date
Instant instant2 = date.toInstant();
//Date转Instant
Date dateFIns = (Date) Date.from(instant2);
System.out.println(instant2+"\tInstant <-> Date\t"+dateFIns);
//时区
System.out.println("----------------ZoneId--------------");
Set strings = ZoneId.getAvailableZoneIds();
// strings.forEach(System.out::println);
ZoneId systemDefault = ZoneId.systemDefault();
System.out.println("----------------systemDefault--------------");
System.out.println(systemDefault);
ZoneId tokyo = ZoneId.of("Asia/Tokyo");
System.out.println(tokyo.getId());
//LocalDateTime <--> Instant
System.out.println("----------------LocalDateTime--------------");
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime ldt = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("LocalDateTime:"+ldt.toString());
Instant insFLdt = ldt.atZone(ZoneId.systemDefault()).toInstant();
System.out.println("Instant:"+insFLdt);
}
}
运行结果:
TemporalAdjuster : 时间校正器。有时我们可能需要获 取例如:将日期调整到“下个周日”等操作。
TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class Demo4 {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println(date);
//下个周五
System.out.println(
date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));
//下个周二
System.out.println(
date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)));
//下个周日
System.out.println(
date.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
}
}
运行结果:
java.time.format.DateTimeFormatter 类:
该类提供了三种 格式化方法: 预定义的标准格式,语言环境相关的格式,自定义的格式
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Demo5 {
public static void main(String[] args) {
// DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE;
// DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
// System.out.println(dtf.getLocale());
DateTimeFormatter dateTimeFormatter =
DateTimeFormatter.ofPattern("yyyy年MM月dd日\tHH:mm:ss\tE");
LocalDateTime ldt = LocalDateTime.now();
//时间 --> 字符串
String stringDate = ldt.format(dateTimeFormatter);
System.out.println(stringDate);
//字符串 --> 时间
LocalDateTime newLdt = ldt.parse(stringDate, dateTimeFormatter);
System.out.println(newLdt);
}
}
运行结果: