学到了吗(java的locale)javalocaldate和date,Java LocalDate、LocalTime、Instant、Duration以及Period,java 时间间隔,
LocalDate & LocalTime
该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息,也不附带任何与时区相关的信息。创建一个LocalDate对象并读取其值LocalDate date = LocalDate.of(2014, 3, 18);int year = date.getYear(); // 2014Month month = date.getMonth(); // MARCHint day = date.getDayOfMonth(); // 18DayOfWeek dow = date.getDayOfWeek(); // TUESDAYint len = date.lengthOfMonth(); // 31 (days in March)boolean leap = date.isLeapYear(); // false (not a leap year)
使用工厂方法从系统时钟中获取当前的日期LocalDate today = LocalDate.now();
使用TemporalField读取LocalDate的值 int y = date.get(ChronoField.YEAR);int m = date.get(ChronoField.MONTH_OF_YEAR);int d = date.get(ChronoField.DAY_OF_MONTH)
创建LocalTime并读取其值 LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20 int hour = time.getHour(); // 13 int minute = time.getMinute(); // 45 int second = time.getSecond(); // 20
使用静态方法parse字符串创建LocalDate date = LocalDate.parse("2014-12-31");LocalTime time = LocalTime.parse("13:22:22");
合并日期和时间(LocalDateTime)这个复合类名叫LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期和时间,但不带有时区信息,你可以直接创建,也可以通过合并日期和时间对象构造,LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); // 2014-03-18T13:45LocalDateTime dt2 = LocalDateTime.of(date, time);LocalDateTime dt3 = date.atTime(13, 45, 20);LocalDateTime dt4 = date.atTime(time);LocalDateTime dt5 = time.atDate(date);
LocalDateTime中提取LocalDate或者LocalTimeLocalDate date1 = dt1.toLocalDate();LocalTime time1 = dt1.toLocalTime();
Instant
作为人,我们习惯于以星期几、几号、几点、几分这样的方式理解日期和时间。毫无疑问,这种方式对于计算机而言并不容易理解。从计算机的角度来看,建模时间最自然的格式是表示一个持续时间段上某个点的单一大整型数。这也是新的java.time.Instant类对时间建模的方式,基本上它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的秒数进行计算。通过向静态工厂方法ofEpochSecond传递一个代表秒数的值创建 Instant instant = Instant.ofEpochSecond(44 * 365 * 86400);
Instant类也支持静态工厂方法now,它能够帮你获取当前时刻的时间戳Instant now = Instant.now();
Duration或Period
Duration类的静态工厂方法between可以通过两个Temporal对象创建,仅可以创建两个LocalTimes对象、两个LocalDateTimes对象,或者两个Instant对象之间的duration,Duration类主要用于以秒和纳秒衡量时间的长短Duration d1 = Duration.between(time1,time2);Duration d2 = Duration.between(datetime1,datetime2);Duration d3 = Duration.between(instant1,instant2);
如果你需要以年、月或者日的方式对多个时间单位建模,可以使用Period类。Period tenDays = Period.between(LocalDate.of(2014,3,8),LocalDate.of(2014,3,18));
创建Duration和Period对象Duration threeMinutes=Duration.ofMinutes(3);Period tenDays = Period.ofDays(10);Period threeWeeks = Period.ofWeeks(3);Period twoYearsSixMonthsOneDay = Period.of(2,6,1);

操纵、解析和格式化日期
LocalDate date1 = LocalDate.of(2014,3,18); //2014-03-18LocalDate date2 = LocalDate.withYear(2011); //2011-03-18LocalDate date3 = LocalDate.withDayOfMonth(25); //2011-03-25LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR,9); //2011-09-25LocalDate date1 = LocalDate.of(2014,3,18); //2014-03-18LocalDate date2 = LocalDate.plusWeeks(1); //2011-03-18LocalDate date3 = date2.minusYears(3); //2011-03-25LOcalDate date4 = date3.plus(6,ChronoUnit.MONTHS); //2011-09-25

TemporalAdjuster
如果你需要进行一些更加复杂的操作,比如,将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,你可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象,更加灵活地处理日期。import static java.time.temporal.TemporalAdjusters.*;LocalDate date1 = LocalDate.of(2014,3,18);LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));LocalDate date3 = date2.with(lastDayOfMonth());

//TemporalAdjuster接口@Functionalinterfacepublic interface TemporalAdjuster{Temporal adjustInto(Temporal temporal);}//常规实现public class NextWorkingDay implements TemporalAdjuster {@Overridepublic Temporal adjustInto(Temporal temporal) {DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));int dayToAdd = 1;if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;return temporal.plus(dayToAdd, ChronoUnit.DAYS);}}//使用date = date.with(new NextWorkingDay());//lambda实现date.with(temporal -> {DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));int dayToAdd = 1;if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;return temporal.plus(dayToAdd, ChronoUnit.DAYS);});
打印输出及解析日期-时间对象
java.time.format包就是特别为了处理日期和时间对象时,格式化以及解析日期-时间对象而设计的LocalDate date = LocalDate.of(2014,3,18);String s1 = date.format(DateTimeFormater.BASIC_ISO_DATE); //20140318String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); //2014-03-18LocalDate date1 = LocalDate.parse("20140318",DateTimeFormatter.BASIC_ISO_DATE);LocalDate date2 = LocalDate.parse("2014-03-18",DateTimeFormatter.ISO_LOCAL_DATE);
按照某个模式创建DateTimeFormatterDateTimeFOrmatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy")LocalDate date1 = LocalDate.of(2014,3,18);String formattedDate = date1.format(formatter);LocalDate date2 = LocalDate.parse(formattedDate,formatter);
创建一个本地化的DateTimeFormatterDateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);LocalDate date1 = LocalDate.of(2014,3,18);String formattedDate = date1.format(italianFormatter);LocalDate date2 = LocalDate.parse(formattedDate,italianFormatter);
构造一个DateTimeFormatterDateTimeFormatter complexFormatter = new DateTimeFormatterBuilder().appendText(ChronoField.DAY_OF_MONTH).appendLiteral(". ").appendText(ChronoField.MONTH_OF_YEAR).appendLiteral(" ").appendText(ChronoField.YEAR).parseCaseInsensitive().toFormatter(Locale.ITALIAN);
时区
新的java.time.ZoneId类是老版java.util.TimeZone的替代品。它的设计目标就是要让你无需为时区处理的复杂和繁琐而操心,比如处理日光时(Daylight Saving Time, DST)这种问题。跟其他日期和时间类一样,ZoneId类也是无法修改的。//地区ID都为“{区域}/{城市}”的格式,这些地区集合的设定都由英特网编号分配机构(IANA)的时区数据库提供。ZoneId romeZone = ZoneId.of("Europe/Rome");ZoneId zoneId = TimeZone,getDefault().toZoneId();
为时间点添加时区信息LocalDate date = LocalDate.of(2014,Month.MARCH,18);ZonedDateTime zdt1 = date.atStartOfDay(romeZone);LocalDateTime dateTime = LocalDateTime.of(2014,Month.MARCH,18,13,45);ZonedDateTime zdt2 = dateTime.atZone(romeZone);Instant instant = Instant.now();ZonedDateTime zdt3 = instant.atZone(romeZone);

LocalDateTime dateTime = LocalDateTime.of(2014,Month.MARCH,18,13,45);Instant instantFromDateTime = dateTime.toInstant(romeZone);Instant instant = Instant.now();LocalDateTime timeFromInstant = LocalDateTime.ofInstant(instant,romeZone);
利用和UTC/格林尼治时间的固定偏差计算时区ZoneOffset newYorkOffset = ZoneOffset.of("-0.5:00");LocalDateTime dateTime = LocalDateTime.of(2014,Month.MARCH,18,13,45);OffsetDateTime dateTimeInNewYork = OffsetDateTime.of(date,newYorkOffset);
日历系统
ISO-8601日历系统是世界文明日历系统的事实标准。但是,Java 8中另外还提供了4种其他的日历系统。这些日历系统中的每一个都有一个对应的日志类,分别是ThaiBuddhistDate、MinguoDate、JapaneseDate以及HijrahDate。所有这些类以及LocalDate都实现了ChronoLocalDate接口,能够对公历的日期进行建模。利用LocalDate对象,你可以创建这些类的实例。LocalDate date = LocalDate.of(2014,Month.MARCH,18);JapaneseDate japaneseDate = JapaneseDate.from(date);Chronology japansesChronology = Chronology.ofLocale(Locale.JAPAN);ChronoLocalDate now = japansesChronology.dateNow();
版权申明
本文系作者 @河马 原创发布在河马博客站点。未经许可,禁止转载。
暂无评论数据