注意
想法及时记录,实现可以待做。
示例介绍
java8提供了一系列全新的处理时间日期的方法,下面就来列举工作中常用的示例吧。
/**
* 默认时区是东八区
*/
private final static String DEFAULT_ZONE_ID = "Asia/Shanghai";
将字符串格式的时间转为时间戳
/**
* 将字符串格式的时间转为时间戳
*
* @param time 时间字符串
* @param pattern 格式化
* @param zoneId 时区
* @return 时间戳
*/
public static long formatter(String time, String pattern, String zoneId) {
if (StringUtil.isBlank(time)) {
throw new IllegalArgumentException("Invalid time");
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.parse(time, formatter).atZone(ZoneId.of(zoneId)).toInstant().toEpochMilli();
}
/**
* 将字符串格式的时间转为时间戳
*
* @param time 时间字符串
* @param pattern 格式化
* @return 时间戳
*/
public static long formatter(String time, String pattern) {
return formatter(time, pattern, DEFAULT_ZONE_ID);
}
格式化时间戳,格式化出来的字符串可以带时区
/**
* 格式化时间戳,格式化出来的字符串可以带时区
*
* @param timestamp 时间戳
* @param pattern 格式化
* @param zoneId 时区
* @return 格式化后的字符串
*/
public static String formatter(long timestamp, String pattern, String zoneId) {
if (timestamp < 0) {
throw new IllegalArgumentException("Invalid milliseconds");
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.of(zoneId)).format(formatter);
}
/**
* 东八区的时间戳格式化
*
* @param timestamp 时间戳
* @param pattern 格式化
* @return 格式化后的字符串
*/
public static String formatter(long timestamp, String pattern) {
return formatter(timestamp, pattern, DEFAULT_ZONE_ID);
}
获取指定时间所在的是第几个季度
/**
* 获取指定时间所在的是第几个季度
* <p>
* The quarter-of-year has values from 1 to 4
*
* @param timestamp 给定的时间戳
* @return 获取指定时间所在的是第几个季度
*/
public static int getQuarterPositionOfTime(long timestamp) {
return LocalDate.from(Instant.ofEpochMilli(timestamp).atZone(ZoneId.of(DEFAULT_ZONE_ID))).get(IsoFields.QUARTER_OF_YEAR);
}
比当前月份更前的月份月末
/**
* 比当前月份更前的月份月末
* <p>
* 比如 1 -> 上个月,2 ->上上个月,0 -> 当月,-1 -> 下一个月
*
* @param monthsToSubtract monthsToSubtract the months to subtract, may be negative
* @return 当前月份偏移的月份的最后一天最后一毫秒
*/
public static long getSubtractMonthEndTime(long monthsToSubtract) {
LocalDate date = LocalDate.now().minusMonths(monthsToSubtract);
LocalDate endDate = date.with(TemporalAdjusters.lastDayOfMonth());
LocalDateTime endTime = endDate.atTime(23, 59, 59, 999999999);
return endTime.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
}
比当前月份更前的月份月初
/**
* 比当前月份更前的月份月初,
* <p>
* 比如 1 -> 上个月,2 ->上上个月,0 -> 当月,-1 -> 下一个月
*
* @param monthsToSubtract the months to subtract, may be negative
* @return 当前月份偏移的月份的第一天凌晨
*/
public static long getSubtractMonthStartTime(long monthsToSubtract) {
LocalDate date = LocalDate.now().minusMonths(monthsToSubtract);
LocalDate startDate = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime startTime = startDate.atTime(0, 0, 0, 0);
return startTime.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
}
获取指定时间戳的所在月份的第1日00:00:00时间戳
/**
* 获取指定时间戳的所在月份的第1日00:00:00时间戳
*
* @param timestamp 给定的时间戳
* @return 获取指定时间戳的所在月份的第1日00:00:00时间戳
**/
public static long getFirstDayOfMonth(long timestamp) {
LocalDate today = LocalDate.from(Instant.ofEpochMilli(timestamp).atZone(ZoneId.of(DEFAULT_ZONE_ID)));
//本月的第一天
LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth(), 1);
LocalDateTime time = firstDay.atTime(0, 0, 0, 0);
return time.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
}
获取指定时间戳所在的「周一」00:00:00时间戳
/**
* 获取指定时间戳所在的「周一」00:00:00时间戳
*
* @param timestamp 给定的时间戳
* @return 获取指定时间戳所在的「周一」00:00:00时间戳
**/
public static long getMondayOfWeek(long timestamp) {
LocalDate date = LocalDate.from(Instant.ofEpochMilli(timestamp).atZone(ZoneId.of(DEFAULT_ZONE_ID))).with(DayOfWeek.MONDAY);
LocalDateTime time = date.atTime(0, 0, 0, 0);
return time.atZone(ZoneId.of(DEFAULT_ZONE_ID)).toInstant().toEpochMilli();
}