Java时间类-Calendar、Date、LocalDateLocalTime
1、Date 类
java.util.Date是⼀个“万能接⼝”,它包含⽇期、时间,还有毫秒数,如果你只想⽤java.util.Date存储⽇期,或者只存储时间,那么,只有你知道哪些部分的数据是有⽤的,哪些部分的数据是不能⽤的。
1.1 Date的构造⽅法
Date 是我们使⽤的最多的⼀个⽇期类,Date提供的构造⽅法在官⽅API中有⼀下⼏种:
Date 类提供了多种构造⽅法,但是⽬前有很多⽅法都已经不建议使⽤
public Date() {
this(System.currentTimeMillis());
}
public Date(long date) {
fastTime = date;
}
@Deprecated
public Date(int year, int month, int date) {
this(year, month, date, 0, 0, 0);
}
@Deprecated
public Date(int year, int month, int date, int hrs, int min) {
this(year, month, date, hrs, min, 0);
}
@Deprecated
public Date(int year, int month, int date, int hrs, int min, int sec)
@Deprecated
public Date(String s) {
this(parse(s));
}
⽬前我们可以通过使⽤:
Date date0 = new Date();
Date date1 = new Date(time);
这两种⽅法创建对象的不同主要是通过指定的时间戳不同,通过设置Date 中的fastTime 进⾏设置Date 对象的时间。
除了使⽤构造⽅法获取实例,Date 还可以通过Instant来创建⼀个Date 实例:
Instant instant = w();
Date date = Date.from(instant);
Instant 是Java 8 提供的新特性:
1.2 Date的常⽤⽅法
Date 类中,提供了常⽤的获取:年,⽉,⽇,时,分,秒等⽅法:
Date date = new Date();
int dates = Date();
int year = Year();
int month = Month();
int day = Day();
int hours = Hours();
int min = Minutes();
int second = Seconds();
long time = Time();
int times = TimezoneOffset();
输出结果:
dates: 14
year: 116
month: 11
day: 3
hours: 15
min: 8
second: 29
time: 1481699309422
times: -480
读者可能会发现,这⾥的年份并不是我们想要的,这⾥主要是因为代码⽅法实现:
我们可以看到,这⾥的getYear 并不是获取当前年份,⽽是获取到和1900年的差值,这⾥主要是因为JDK⽼版本遗留下来的问题,对于Date 中获取年⽉⽇的⽅法,现在已经不建议使⽤了。
Date类中也提供了⼀些设置⽇期的⽅法:
与上⾯的get⽅法是⼀⼀对应的,但是现在也同样不建议使⽤了。
1.3 Date的总结
经过我们上述的分析,我们发现,Date 类如今很多⽅法已经没有什么⽤处了,确实,如今时间的处理并不直接在Date 类中进⾏,⽽是通过Calendar,或者LocalDate 来进⾏,我们再⽇常使⽤中,更多的是要来做⼀个记录⽇期的实例。
2、Calendar 类
介绍⼀下Date 与 Calendar 的区别
Date⽤于记录某⼀个含⽇期的、精确到毫秒的时间。重点在代表⼀刹那的时间本⾝。
Calendar⽤于将某⼀⽇期放到历法中的互动——时间和年、⽉、⽇、星期、上午、下午、夏令时等这些历法规定互相作⽤关系和互动。Calendar本⾝代表公历的⼀个简化缩⽔版,姑且叫“计算机历”。
完整的公历是格⾥⾼利历,Java SE中以GregorianCalendar类来提供相关的历法功能。
2.1 Calendar 的构造⽅法
我们可以看到,Calendar 中的构造⽅法被封装在包中,我们⽆法直接通过构造⽅法来创建⼀个新的实例对象,我们只能通过调⽤ Calendar 中的静态⽅法 Instance()⽅法获取⼀个实例对象。
我们看⼀下官⽅API 中提供了哪些⽅法获取Calendar 对象:
这是官⽅⽂档给出的获取去对象实例的⽅法,我们可以看到,我们可以通过指定TimeZone 和 Locale 来获取特定的 Calendar 对象,这也却分了每个地区的时间⽇历,⽅便开发者使⽤
除了通过getInstance()⽅法获取实例以外,Java 1.8 提供了⼀个内部类:
我们可以通过创建⼀个Builder 的实体,然后通过调⽤Build ⽅法获取⼀个 Calendar 实例。
在Builder 中,Builder 类提供了设置年⽉⽇的⽅法,可以通过设置时间,来获取特定的Calendar 对象。
Calendar.Builder builder =new Calendar.Builder();
Calendar calendar1 = builder.build();
Date date = Time();
这⾥总结⼀下:
Calendar 提供的获取实例的⽅法主要有两种途径:
1、调⽤Instance()⽅法
2、创建内部类Builder 的实例,通过调⽤其 build()⽅法创建 Calendar 实例
对于第⼀种⽅法,只能先获取当前时间的Calendar,然后再通过调⽤相应的set ⽅法设置年⽉⽇等,⽽如果使⽤内部类Builder ⽅法,可以通过setInstant ⽅法设置我们所期望的时间。
2.2 Calendar 的常⽤⽅法
我们最常⽤的⽅法有:
Calendar calendar = Instance();
Date date = Time();
通过Calendar ⽅法获取⼀个Date 的实例。
Calendar ⽅法获取年⽉⽇的⽅法:
int year =(Calendar.YEAR);
int (Calendar.MONTH)+1;
int day =(Calendar.DAY_OF_MONTH);
int hour =(Calendar.HOUR_OF_DAY);
int minute =(Calendar.MINUTE);
int seconds =(Calendar.SECOND);
我们可以看到Calendar ⾥⾯获取年⽉⽇不像上⾯ Date 类中的通过访问各个⽅法来获取。
Calendar 在初始化的时候,就已经将年⽉⽇划分好,并且存⼊fields 变量中。我们只需要传⼊每个位置编号,就可以获取我们需要的信息
除了获取以外,Calendar 也提供了相应的set ⽅法:
通过重新传⼊参数,设置Calendar 的时间
Calendar 获取当前⽉份,当前星期的最⼤\⼩天数
System.out.ActualMaximum(Calendar.DAY_OF_WEEK));
System.out.ActualMaximum(Calendar.DAY_OF_MONTH));
System.out.ActualMinimum(Calendar.DAY_OF_WEEK));
System.out.ActualMinimum(Calendar.DAY_OF_MONTH));
提供了Before 和After 两个⽅法,⽤于判断当前时间与对⽐时间先后:
提供了add ⽅法进⾏⽇期的加减
calendar.add(10,10);
java时间日期格式转换 2.3 Calendar 的总结
从上⾯的分析我们可以看到,Calendar 类主要是⽤于作为⽇历的对象,可以铜⿎哦设置地区时间,区分每个地区的⽇期,Calendar 提供的⽅法也没有很多对时间进⾏的⼀些操作。
3、LocalDate/LocalTime 类
Java 8新增了LocalDate和LocalTime接⼝,为什么要搞⼀套全新的处理⽇期和时间的API?因为旧的java.util.Date实在是太难⽤了。
java.util.Date⽉份从0开始,⼀⽉是0,⼗⼆⽉是11,变态吧!java.time.LocalDate⽉份和星期都改成了enum,就不可能再⽤错了。
java.util.Date和SimpleDateFormatter都不是线程安全的,⽽LocalDate和LocalTime和最基本的String⼀样,是不变类型,不但线程安全,⽽且不能修改。
3.1 LocalDate/LocalTime 的构造⽅法
3.1.1 LocalDate 的构造⽅法:
LocalDate 并没有提供公开的构造⽅法,只提供了⼀个封装的构造⽅法供内部使⽤。
private LocalDate(int year, int month, int dayOfMonth) {
this.day = (short) dayOfMonth;
}
LocalDate 提供了三种创建实例的⽅法:
//获取当前时间的LocalDate
LocalDate localDate = w();
//获取指定年、⽉、⽇的 LocalDate
LocalDate ofDate = LocalDate.of(2016,12,31);
//通过解析字符串获取 LocalDate,如果格式不对会抛出 DateTimeParseException
LocalDate parseDate = LocalDate.parse("2016-12-31-");
3.1.2 LocalTime 的构造⽅法:
LocalTime 与LcoalDate ⼀样,提供了⼀个封装的构造⽅法:
private LocalTime(int hour, int minute, int second, int nanoOfSecond) {
this.hour = (byte) hour;
this.minute = (byte) minute;
this.second = (byte) second;
this.nano = nanoOfSecond;
}
LocalTime 提供了三种创建⽅法:
LocalTime localTime = w().withNano(0);
LocalTime ofTime = LocalTime.of(16,30,25);
LocalTime parseTime = LocalTime.parse("12:00:01");
3.2 LocalDate/LocalTime 的常⽤⽅法
获取当天的起始时间:atStartOfDay()
LocalDate localDate = w();
LocalDateTime date = localDate.atStartOfDay();
输出:
2016-12-14T00:00
设置当前⽇期的时间:atTime()
LocalDate localDate = w();
LocalDateTime date = localDate.atTime(16,25,30);
输出:
2016-12-14T16:25:30
格式转换:format()
常⽤的获取年、⽉、⽇等⽅法
int year = Year();
int month = MonthValue();
int day = DayOfMonth();
获取改变⽉份的LocalDate :withMonth()
LocalDate localDate = w();
LocalDate d = localDate.withMonth(10);
其他常⽤的⽇期转换:
// 取本⽉第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
// 取本⽉第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
// 取本⽉最后⼀天,再也不⽤计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
// 取下⼀天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01
// 取2015年1⽉第⼀个周⼀,这个计算⽤Calendar要死掉很多脑细胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05 3.3 LocalDate/LocalTime 的总结
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论