日期
1 日期类:java.util.Date
1.1Date概述
很多方法都过时了,推荐使用日历类Calendar来进行代替。
1.2 简单使用
public static void main(String
[] args
) {
Date date
=new Date();
System
.out
.println(date
);
Date date1
=new Date(0l
);
System
.out
.println(date1
);
date1
.setYear(date
.getYear()-1);
System
.out
.println(date1
);
System
.out
.println(date
.getTime());
date
.setTime(0);
System
.out
.println(date
);
String localeString
= date
.toLocaleString();
System
.out
.println(localeString
);
System
.out
.println(dateToStr(new Date()));
}
public static String
dateToStr(Date date
) {
int year
= date
.getYear();
int month
=date
.getMonth();
int day
=date
.getDate();
int week
=date
.getDay();
int hour
=date
.getHours();
int minute
=date
.getMinutes();
int second
=date
.getSeconds();
String weeks
="一二三四五六日";
return (1900+year
)+"年"+(month
+1)+"月"+day
+"日"
+" 星期"+weeks
.charAt(week
-1)+"\t"+hour
+"时"+month
+"分"+second
+"秒";
}
2 SimpleDateFormat
2.1 出现背景
Data类的API不易于国际化,该类是为了对日期Date类进行格式化和解析,位于java.text.SimpleDateFormat。
年月日星期时分秒
yMdEHms
2.2 简单使用
@Test
public void TestSimpleDateFormat() throws ParseException
{
SimpleDateFormat simpleDateFormat
= new SimpleDateFormat();
Date date
= new Date();
System
.out
.println(date
);
String format
= simpleDateFormat
.format(date
);
System
.out
.println(format
);
SimpleDateFormat simpleDateFormat1
= new SimpleDateFormat("yyyy-MM-dd");
String string
="2019-08-09";
Date parse
= simpleDateFormat1
.parse(string
);
System
.out
.println(parse
);
System
.out
.println(simpleDateFormat1
.parse(format
));
System
.out
.println(simpleDateFormat1
.format(date
));
}
2.3 常见场景
@Test
public void test01() throws ParseException
{
String string
="2020-8-9";
SimpleDateFormat simpleDateFormat
= new SimpleDateFormat("yyyy-MM-dd");
Date parse
= simpleDateFormat
.parse(string
);
java
.sql
.Date date
=new java.sql.Date(parse
.getTime());
System
.out
.println(date
);
System
.out
.println(date
.getClass());
}
public static void main(String
[] args
) {
try {
new SimpleDateFormatTest().test02();
} catch (ParseException e
) {
System
.out
.println(e
.getMessage());
}
}
public void test02() throws ParseException
{
String startDate
="1990-1-1";
SimpleDateFormat simpleDateFormat
= new SimpleDateFormat("yyyy-MM-dd");
Date parse
= simpleDateFormat
.parse(startDate
);
long start
=parse
.getTime();
Scanner scanner
= new Scanner(System
.in
);
while(true){
System
.out
.println("请输入日期(xxxx-MM-dd):");
String next
= scanner
.next();
Date parse1
= simpleDateFormat
.parse(next
);
long end
=parse1
.getTime();
switch ((int)(((end
-start
)/1000/60/60/24)%5)){
case 0:
case 1:
case 2:
System
.out
.println("打渔!!!");
break;
default:
System
.out
.println("晒网");
break;
}
}
}
3 日历类:Calendar
3.1 简介
所述Calendar类是一个抽象类,可以为在某一特定时刻和一组属性之间的转换的方法[calendar fields]如YEAR , MONTH ,DAY_OF_MONTH ,HOUR 等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从1970年1月1日00:00 00:00.000 GMT(Gregorian)的Epoch的偏移量
3.2 对象的创建
创建其子类(GregorianCalendar)对象。 调用其静态方法getInstance():实际返回的依旧是其子类对象
3.3 常用方法
**get(int field):**填入Calendar中的静态属性。可以获取一些常用的属性**set(int field,int value):**修改当前Calendar对象的值。**add():**增加指定值到当前属性。**getTime():**日历类–>Date**setTime(Date date):**Date–>日期类
3.4 简单使用
@Test
public void testCalendar(){
Calendar instance
= Calendar
.getInstance();
System
.out
.println(instance
.getClass());
int i
= instance
.get(Calendar
.DAY_OF_MONTH
);
System
.out
.println(i
);
instance
.set(Calendar
.DAY_OF_MONTH
,22);
int i1
= instance
.get(Calendar
.DAY_OF_MONTH
);
System
.out
.println(i1
);
instance
.add(Calendar
.DAY_OF_MONTH
,3);
int i2
= instance
.get(Calendar
.DAY_OF_MONTH
);
System
.out
.println(i2
);
Date time
= instance
.getTime();
System
.out
.println(time
);
Date date
= new Date();
instance
.setTime(date
);
int i3
= instance
.get(Calendar
.DAY_OF_MONTH
);
System
.out
.println(i3
);
Date date1
= new Date(2020, 10, 1);
System
.out
.println(date1
);
}
4 日期时间:LocalDateTime
4.1 出现的背景
在开发过程中我们发现之前的日期类和日历类存在一些问题。
可变性:像日期和时间这样的类应该是不可变的。
偏移性:Date中的年份是从1900年开始的,月份是从0开始的。
Date date1 = new Date(2020, 10, 1);
System.out.println(date1); //Mon Nov 01 00:00:00 CST 3920
格式化:格式化只对Date有用(SimpleDateFormat),Calendar则不行。
也不是线程安全的,也不能处理闰秒等。
4.2 改进
java8吸收了joda-Time的精华,新的java.time中包括所有关于本地日期(LocalDate),本地时间(LocalTime),本地日期时间(LocalDateTime),时区(ZonedDateTime)和持续时间(Duration)的类。Date类新增了toInstant( )用于将Date转换成新的表示形式。这些新增的本地化时间日期API大大的简化了日期时间和本地化的管理。
4.3 包结构
java.time-包含值对象的基础包。java.time.chrono-提供对不同的日历系统的访问java.time.format-格式化和解析时间和日期java.time.temporal-包括底层框架和扩展性java.time.zone-包括时区支持的类。
4.4 简单使用
@Test
public void testTime(){
LocalDate now
= LocalDate
.now();
LocalTime now1
= LocalTime
.now();
LocalDateTime now2
= LocalDateTime
.now();
System
.out
.println(now
);
System
.out
.println(now1
);
System
.out
.println(now2
);
LocalDateTime of
= LocalDateTime
.of(2020, 10, 1, 8, 10, 4);
System
.out
.println(of
);
System
.out
.println(now2
.getDayOfMonth());
System
.out
.println(now2
.getDayOfWeek());
System
.out
.println(now2
.getMonth());
System
.out
.println(now2
.getDayOfYear());
LocalDateTime localDateTime
= now2
.withDayOfMonth(21);
System
.out
.println(localDateTime
);
System
.out
.println(now2
);
LocalDateTime localDateTime1
= localDateTime
.plusMonths(3);
System
.out
.println(localDateTime
);
System
.out
.println(localDateTime1
);
LocalDateTime localDateTime2
= localDateTime
.minusDays(1);
System
.out
.println(localDateTime
);
System
.out
.println(localDateTime2
);
}
4.5 练习
@Test
public void test04(){
LocalDate today
= LocalDate
.now();
System
.out
.println("Current Date="+today
);
LocalDate firstDay_2014
= LocalDate
.of(2014, Month
.JANUARY
, 1);
System
.out
.println("Specific Date="+firstDay_2014
);
LocalDate todayKolkata
= LocalDate
.now(ZoneId
.of("Asia/Kolkata"));
System
.out
.println("Current Date in IST="+todayKolkata
);
LocalDate dateFromBase
= LocalDate
.ofEpochDay(365);
System
.out
.println("365th day from base date= "+dateFromBase
);
LocalDate hundredDay2014
= LocalDate
.ofYearDay(2014, 100);
System
.out
.println("100th day of 2014="+hundredDay2014
);
}
拓展:
1 瞬时
1.1 瞬时简介
instant:时间线上的一个瞬时点,可能被用来记录应用程序中的事件时间戳。对于人来说年月日时分秒,对于机器来说时间线中一个点就是一个很大的数,有利于计算的处理。UNIX中这个数从1970年开始(utc),以秒为单位,在java中以毫秒为单位。java.time包是基于纳秒计算的,所以instant可以精确到纳秒。
常见的时间标准:
UTC:世界标准时间GMT:格林尼治时间==>英国CST:北京时间。UTC+8
1.2 瞬时简单使用
@Test
public void testInstant(){
Instant now
= Instant
.now();
System
.out
.println(now
);
OffsetDateTime offsetDateTime
= now
.atOffset(ZoneOffset
.ofHours(8));
System
.out
.println(offsetDateTime
);
long l
= now
.toEpochMilli();
System
.out
.println(l
);
Instant instant
= Instant
.ofEpochMilli(l
);
System
.out
.println(instant
);
}
2 DateTimeFormatter
2.1 简介
对时间进行本土化设置。
2.2 简单使用
@Test
public void testDateTimeFormat(){
DateTimeFormatter isoLocalDateTime
= DateTimeFormatter
.ISO_LOCAL_DATE_TIME
;
LocalDateTime localDateTime
= LocalDateTime
.now();
String format
= isoLocalDateTime
.format(localDateTime
);
System
.out
.println(format
);
TemporalAccessor parse
= isoLocalDateTime
.parse(format
);
System
.out
.println(parse
);
DateTimeFormatter dateTimeFormatter
= DateTimeFormatter
.ofLocalizedDateTime(FormatStyle
.SHORT
);
String format1
= dateTimeFormatter
.format(localDateTime
);
System
.out
.println(format1
);
DateTimeFormatter dateTimeFormatter2
= DateTimeFormatter
.ofLocalizedDateTime(FormatStyle
.LONG
);
String format2
= dateTimeFormatter2
.format(localDateTime
);
System
.out
.println(format2
);
DateTimeFormatter dateTimeFormatter3
= DateTimeFormatter
.ofLocalizedDateTime(FormatStyle
.MEDIUM
);
String format3
= dateTimeFormatter3
.format(localDateTime
);
System
.out
.println(format3
);
LocalDate localDate
= LocalDate
.now();
DateTimeFormatter dateTimeFormatter1
= DateTimeFormatter
.ofLocalizedDate(FormatStyle
.FULL
);
String format4
= dateTimeFormatter1
.format(localDate
);
System
.out
.println(format4
);
DateTimeFormatter dateTimeFormatter4
= DateTimeFormatter
.ofPattern("yyyy-MM-dd hh:mm:ss E");
String format5
= dateTimeFormatter4
.format(localDateTime
);
System
.out
.println(format5
);
TemporalAccessor parse1
= dateTimeFormatter4
.parse(format5
);
System
.out
.println(parse1
);
}