新增DateTimeUtils (#731)

* 新增DateTimeUtils

* 提交测试用例
pull/732/head
Lei XinXin 2020-03-28 15:08:24 +08:00 committed by GitHub
parent 49486198df
commit b4ebf7218e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 708 additions and 11 deletions

View File

@ -10,9 +10,9 @@ import run.halo.app.repository.PostCommentRepository;
import run.halo.app.service.CommentBlackListService;
import run.halo.app.service.OptionService;
import run.halo.app.service.base.AbstractCrudService;
import run.halo.app.utils.DateTimeUtils;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Optional;
@ -26,7 +26,6 @@ import java.util.Optional;
@Service
@Slf4j
public class CommentBlackListServiceImpl extends AbstractCrudService<CommentBlackList, Long> implements CommentBlackListService {
private static final ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai");
private final CommentBlackListRepository commentBlackListRepository;
private final PostCommentRepository postCommentRepository;
private final OptionService optionService;
@ -50,10 +49,9 @@ public class CommentBlackListServiceImpl extends AbstractCrudService<CommentBlac
*/
Optional<CommentBlackList> blackList = commentBlackListRepository.findByIpAddress(ipAddress);
LocalDateTime now = LocalDateTime.now();
Date endTime = new Date(now.atZone(ZONE_ID).toInstant().toEpochMilli());
Date endTime = new Date(DateTimeUtils.toEpochMilli(now));
Integer banTime = optionService.getByPropertyOrDefault(CommentProperties.COMMENT_BAN_TIME, Integer.class, 10);
Date startTime = new Date(now.minusMinutes(banTime)
.atZone(ZONE_ID).toInstant().toEpochMilli());
Date startTime = new Date(DateTimeUtils.toEpochMilli(now.minusMinutes(banTime)));
Integer range = optionService.getByPropertyOrDefault(CommentProperties.COMMENT_RANGE, Integer.class, 30);
boolean isPresent = postCommentRepository.countByIpAndTime(ipAddress, startTime, endTime) >= range;
if (isPresent && blackList.isPresent()) {
@ -79,6 +77,6 @@ public class CommentBlackListServiceImpl extends AbstractCrudService<CommentBlac
}
private Date getBanTime(LocalDateTime localDateTime, Integer banTime) {
return new Date(localDateTime.plusMinutes(banTime).atZone(ZONE_ID).toInstant().toEpochMilli());
return new Date(DateTimeUtils.toEpochMilli(localDateTime.plusMinutes(banTime)));
}
}

View File

@ -0,0 +1,543 @@
package run.halo.app.utils;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import static cn.hutool.core.date.DatePattern.*;
/**
*
*
* @author LeiXinXin
* @date 2019/12/10
*/
public class DateTimeUtils {
/**
* {@link DateTimeFormatter}yyyyMMddHHmmssSSS
*/
public static final DateTimeFormatter PURE_DATETIME_MS_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern(PURE_DATETIME_PATTERN)
.appendValue(ChronoField.MILLI_OF_SECOND, 3)
.toFormatter();
/**
* {@link DateTimeFormatter}yyyyMMdd
*/
public static final DateTimeFormatter PURE_DATE_FORMATTER = DateTimeFormatter.ofPattern(PURE_DATE_PATTERN);
/**
* {@link DateTimeFormatter}yyyy-MM-dd
*/
public static final DateTimeFormatter NORM_DATE_FORMATTER = DateTimeFormatter.ofPattern(NORM_DATE_PATTERN);
/**
* HHmm
*/
public final static String TIME_PATTERN = "HHmm";
/**
* {@link DateTimeFormatter} HHmm
*/
public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern(TIME_PATTERN);
/**
* HH:mm
*/
public final static String NORM_TIME_PATTERN = "HH:mm";
/**
* {@link DateTimeFormatter} HH:mm
*/
public static final DateTimeFormatter NORM_TIME_FORMATTER = DateTimeFormatter.ofPattern(NORM_TIME_PATTERN);
/**
* {@link DateTimeFormatter}yyyy-MM-dd HH:mm:ss
*/
public static final DateTimeFormatter NORM_DATETIME_FORMATTER = DateTimeFormatter.ofPattern(NORM_DATETIME_PATTERN);
/**
*
*/
public static final String CTT = ZoneId.SHORT_IDS.get("CTT");
/**
*
*/
public static final ZoneId CTT_ZONE_ID = ZoneId.of(CTT);
private DateTimeUtils() {
}
/**
*
*
* @return Now LocalDateTime
*/
public static LocalDateTime now() {
return now(CTT_ZONE_ID);
}
/**
*
*
* @param zoneId
* @return Now LocalDateTime
*/
public static LocalDateTime now(ZoneId zoneId) {
return LocalDateTime.now(zoneId);
}
/**
* yyyyMMdd
*
* @param localDateTime
* @return Result
*/
public static String formatDate(LocalDateTime localDateTime) {
return format(localDateTime, PURE_DATE_FORMATTER);
}
/**
* yyyyMMdd
*
* @param localDate
* @return Result
*/
public static String formatDate(LocalDate localDate) {
return format(localDate, PURE_DATE_FORMATTER);
}
/**
* HHmm
*
* @param localDateTime
* @return Result
*/
public static String formatTime(LocalDateTime localDateTime) {
return format(localDateTime, TIME_FORMATTER);
}
/**
* HHmm
*
* @param localTime
* @return Result
*/
public static String formatTime(LocalTime localTime) {
return format(localTime, TIME_FORMATTER);
}
/**
* yyyy-MM-dd HH:mm:ss
*
* @param localDateTime
* @return Result
*/
public static String formatDateTime(LocalDateTime localDateTime) {
return format(localDateTime, NORM_DATETIME_FORMATTER);
}
/**
*
*
* @param localDateTime
* @param formatter
* @return Result
*/
public static String format(LocalDateTime localDateTime, DateTimeFormatter formatter) {
return localDateTime.format(formatter);
}
/**
*
*
* @param localTime
* @param formatter
* @return Result
*/
public static String format(LocalTime localTime, DateTimeFormatter formatter) {
return localTime.format(formatter);
}
/**
*
*
* @param localDate
* @param formatter
* @return Result
*/
public static String format(LocalDate localDate, DateTimeFormatter formatter) {
return localDate.format(formatter);
}
/**
*
* <p>
* yyyyMMddHHmmssSSS
*
* @param time
* @return LocalDateTime
*/
public static LocalDateTime parseCttDateTime(String time) {
return parse(time, PURE_DATETIME_MS_FORMATTER);
}
/**
*
*
* @param formatter
* @param time
* @return LocalDateTime
*/
public static LocalDateTime parse(String time, DateTimeFormatter formatter) {
return LocalDateTime.parse(time, formatter);
}
/**
* to instant by default zoneId(Shanghai)
*
* @param localDateTime
* @return Instant
*/
public static Instant toInstant(LocalDateTime localDateTime) {
return toInstant(localDateTime, CTT_ZONE_ID);
}
/**
* To instant by zoneId
*
* @param localDateTime
* @return Instant
*/
public static Instant toInstant(LocalDateTime localDateTime, ZoneId zoneId) {
return localDateTime.atZone(zoneId).toInstant();
}
/**
* localDateTime
*
* @param localDateTime
* @return
*/
public static long getEpochSecond(LocalDateTime localDateTime) {
return toInstant(localDateTime).getEpochSecond();
}
/**
* localDateTime
*
* @param localDateTime
* @return
*/
public static long toEpochMilli(LocalDateTime localDateTime) {
return toInstant(localDateTime).toEpochMilli();
}
/**
* 0
*
* @param localDateTime
* @return LocalDateTime
*/
public static LocalDateTime secondAndNanoSetZero(LocalDateTime localDateTime) {
return localDateTime.withSecond(0).withNano(0);
}
/**
*
*
* @param localDateTime
* @return LocalDateTime
*/
public static LocalDateTime plusOneDayToDateTime(LocalDateTime localDateTime) {
return plusDays(localDateTime, 1);
}
/**
*
*
* @param localDateTime
* @param localTime
* @return LocalDateTime
*/
public static LocalDateTime plusOneDay(LocalDateTime localDateTime, LocalTime localTime) {
return plusOneDay(localDateTime.toLocalDate(), localTime);
}
/**
*
*
* @param localDate
* @param localTime
* @return LocalDateTime
*/
public static LocalDateTime plusOneDay(LocalDate localDate, LocalTime localTime) {
final LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
return plusDays(localDateTime, 1);
}
/**
*
*
* @param localDateTime
* @return LocalDate
*/
public static LocalDate plusOneDayToDate(LocalDateTime localDateTime) {
return plusDays(localDateTime, 1).toLocalDate();
}
/**
* days
*
* @param localDateTime
* @param days
* @return days LocalDateTime
*/
public static LocalDateTime plusDays(LocalDateTime localDateTime, long days) {
return localDateTime.plusDays(days);
}
/**
*
*
* @param localDate
* @return LocalDate
*/
public static LocalDate plusOneDayToDate(LocalDate localDate) {
return plusDays(localDate, 1);
}
/**
* days
*
* @param localDate
* @param days
* @return days LocalDate
*/
public static LocalDate plusDays(LocalDate localDate, long days) {
return localDate.plusDays(days);
}
/**
* 1
*
* @param localDateTime
* @return LocalDateTime
*/
public static LocalDateTime plusOneMinute(LocalDateTime localDateTime, LocalTime localTime) {
return plusOneMinute(localDateTime.toLocalDate(), localTime);
}
/**
* 1
*
* @param localDate
* @param localTime
* @return LocalDateTime
*/
public static LocalDateTime plusOneMinute(LocalDate localDate, LocalTime localTime) {
final LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
return plusMinutes(localDateTime, 1);
}
/**
* 1
*
* @param localDateTime
* @return LocalDateTime
*/
public static LocalDateTime plusOneMinute(LocalDateTime localDateTime) {
return plusMinutes(localDateTime, 1);
}
/**
* 30
*
* @param localDateTime
* @return LocalDateTime
*/
public static LocalDateTime plusThirtyMinute(LocalDateTime localDateTime) {
return plusMinutes(localDateTime, 30);
}
/**
* 1
*
* @param localDateTime
* @return LocalTime
*/
public static LocalTime plusOneMinuteToTime(LocalDateTime localDateTime) {
return plusMinutes(localDateTime, 1).toLocalTime();
}
/**
* 1
*
* @param localTime
* @return LocalTime
*/
public static LocalTime plusOneMinute(LocalTime localTime) {
return plusMinutes(localTime, 1);
}
/**
* 30
*
* @param localTime
* @return LocalTime
*/
public static LocalTime plusThirtyMinute(LocalTime localTime) {
return plusMinutes(localTime, 30);
}
/**
* minutes
*
* @param localDateTime
* @param minutes
* @return LocalDateTime
*/
public static LocalDateTime plusMinutes(LocalDateTime localDateTime, long minutes) {
return localDateTime.plusMinutes(minutes);
}
/**
* minutes
*
* @param localTime
* @param minutes
* @return LocalTime
*/
public static LocalTime plusMinutes(LocalTime localTime, long minutes) {
return localTime.plusMinutes(minutes);
}
/**
* 1
*
* @param localDateTime
* @param localTime
* @return LocalTime
*/
public static LocalDateTime minusOneMinutes(LocalDateTime localDateTime, LocalTime localTime) {
return minusOneMinutes(localDateTime.toLocalDate(), localTime);
}
/**
* 1
*
* @param localDate
* @param localTime
* @return LocalTime
*/
public static LocalDateTime minusOneMinutes(LocalDate localDate, LocalTime localTime) {
final LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
return minusMinutes(localDateTime, 1);
}
/**
* 1
*
* @param localDateTime
* @return LocalTime
*/
public static LocalDateTime minusOneMinutes(LocalDateTime localDateTime) {
return minusMinutes(localDateTime, 1);
}
/**
* minutes
*
* @param localDateTime
* @param minutes
* @return LocalTime
*/
public static LocalDateTime minusMinutes(LocalDateTime localDateTime, long minutes) {
return localDateTime.minusMinutes(minutes);
}
/**
* minutes
*
* @param localTime
* @param minutes
* @return LocalTime
*/
public static LocalTime minusMinutes(LocalTime localTime, long minutes) {
return localTime.minusMinutes(minutes);
}
/**
*
*
* @param startInclusive Start
* @return boolean
*/
public static boolean isNoon(LocalDateTime startInclusive) {
LocalDateTime noonDateTime = LocalDateTime.of(startInclusive.toLocalDate(), LocalTime.NOON);
return Duration.between(startInclusive, noonDateTime).isZero();
}
/**
*
*
* @param startInclusive Start
* @return boolean
*/
public static boolean isNoon(LocalTime startInclusive) {
return Duration.between(startInclusive, LocalTime.NOON).isZero();
}
/**
* startInclusive endInclusive
*
* @param startInclusive Start
* @param endInclusive end
* @return boolean
*/
public static boolean isNegative(Temporal startInclusive, Temporal endInclusive) {
return Duration.between(startInclusive, endInclusive).isNegative();
}
/**
* 00
*
* @param startInclusive Start
* @param endInclusive end
* @return boolean
*/
public static boolean isZero(Temporal startInclusive, Temporal endInclusive) {
return Duration.between(startInclusive, endInclusive).isZero();
}
/**
* endInclusive startInclusive
*
* @param startInclusive Start
* @param endInclusive end
* @return boolean
*/
public static boolean isGreaterOrEqual(Temporal startInclusive, Temporal endInclusive) {
return Duration.between(startInclusive, endInclusive).toNanos() >= 0;
}
/**
* endInclusive startInclusive
*
* @param startInclusive Start
* @param endInclusive end
* @return boolean
*/
public static boolean isGreater(Temporal startInclusive, Temporal endInclusive) {
return Duration.between(startInclusive, endInclusive).toNanos() > 0;
}
/**
* endInclusive startInclusive
*
* @param startInclusive Start
* @param endInclusive end
* @return boolean
*/
public static boolean isLessThanOrEqual(Temporal startInclusive, Temporal endInclusive) {
return Duration.between(startInclusive, endInclusive).toNanos() <= 0;
}
}

View File

@ -0,0 +1,156 @@
package run.halo.app.utils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;
import java.time.*;
import java.time.format.DateTimeFormatter;
/**
* DateTimeUtils
*
* @author LeiXinXin
* @date 2020/1/9
*/
@RunWith(SpringRunner.class)
public class DateTimeUtilsTest {
/**
*
*/
@Test
public void nowTest() {
final LocalDateTime now = DateTimeUtils.now().withNano(0);
Assert.assertNotNull(now);
final LocalDateTime ctt = DateTimeUtils.now(ZoneId.of(ZoneId.SHORT_IDS.get("CTT"))).withNano(0);
Assert.assertNotNull(ctt);
Assert.assertEquals(Duration.between(now, ctt).toMinutes(), 0);
}
/**
*
*/
@Test
public void formatTest() {
final LocalDateTime now = LocalDateTime.of(2020, 1, 9, 20, 20, 20);
final String formatDate = DateTimeUtils.formatDate(now);
Assert.assertEquals(formatDate, "20200109");
final LocalDate localDate = LocalDate.of(2020, 1, 9);
final String localFormatDate = DateTimeUtils.formatDate(localDate);
Assert.assertEquals(localFormatDate, "20200109");
final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
final String formatDateTime1 = DateTimeUtils.format(now, dateTimeFormatter);
Assert.assertEquals(formatDateTime1, "2020/01/09");
final LocalTime time1 = LocalTime.of(10, 20);
final String formatTime = DateTimeUtils.formatTime(time1);
Assert.assertEquals(formatTime, "1020");
final String formatTime1 = DateTimeUtils.format(time1, DateTimeFormatter.ofPattern("HH:mm"));
Assert.assertEquals(formatTime1, "10:20");
}
/**
*
*/
@Test
public void plusTest() {
final LocalDateTime now = LocalDateTime.of(2020, 1, 9, 10, 20);
final LocalDateTime localDateTime = DateTimeUtils.plusOneMinute(now);
Assert.assertEquals(localDateTime.toString(), "2020-01-09T10:21");
LocalTime localTime = LocalTime.of(7, 30);
final LocalDateTime localDateTime1 = DateTimeUtils.plusOneMinute(now, localTime);
Assert.assertEquals(localDateTime1.toString(), "2020-01-09T07:31");
final LocalDate date = LocalDate.of(2020, 1, 3);
final LocalDateTime localDateTime2 = DateTimeUtils.plusOneMinute(date, localTime);
Assert.assertEquals(localDateTime2.toString(), "2020-01-03T07:31");
final LocalTime localTime1 = DateTimeUtils.plusOneMinute(localTime);
Assert.assertEquals(localTime1.toString(), "07:31");
final LocalDateTime localDateTime3 = DateTimeUtils.plusDays(now, 10);
Assert.assertEquals(localDateTime3.toString(), "2020-01-19T10:20");
}
/**
* LocalDateTime
*/
@Test
public void parseTest() {
String time = "20200109135500000";
final LocalDateTime localDateTime = DateTimeUtils.parseCttDateTime(time);
Assert.assertEquals(localDateTime.toString(), "2020-01-09T13:55");
String time2 = "2020/1/9 13:56";
final LocalDateTime dateTime = DateTimeUtils.parse(time2, DateTimeFormatter.ofPattern("yyyy/M/d HH:mm"));
Assert.assertEquals(dateTime.toString(), "2020-01-09T13:56");
}
/**
*
*/
@Test
public void minusTest() {
final LocalDateTime now = LocalDateTime.of(2020, 1, 3, 14, 20);
final LocalDateTime localDateTime = DateTimeUtils.minusOneMinutes(now);
Assert.assertEquals(localDateTime.toString(), "2020-01-03T14:19");
}
/**
* Instant
*/
@Test
public void toInstantTest() {
final LocalDateTime now = LocalDateTime.of(2020, 1, 3, 14, 20);
final Instant instant = DateTimeUtils.toInstant(now);
Assert.assertEquals(instant.toString(), "2020-01-03T06:20:00Z");
final Instant jst = DateTimeUtils.toInstant(now, ZoneId.of(ZoneId.SHORT_IDS.get("JST")));
Assert.assertEquals(jst.toString(), "2020-01-03T05:20:00Z");
}
/**
* 使
*/
@Test
public void other() {
LocalDateTime startInclusive = LocalDateTime.of(2020, 1, 3, 10, 10, 30);
LocalDateTime endInclusive = LocalDateTime.of(2020, 1, 4, 10, 10, 30);
// End 大于等于 Start
final boolean greaterOrEqual = DateTimeUtils.isGreaterOrEqual(startInclusive, endInclusive);
Assert.assertTrue(greaterOrEqual);
/*
*
*/
final boolean lessThanOrEqual = DateTimeUtils.isLessThanOrEqual(startInclusive, endInclusive);
Assert.assertFalse(lessThanOrEqual);
/*
* 0
*/
final boolean zero = DateTimeUtils.isZero(startInclusive, endInclusive);
Assert.assertFalse(zero);
// 是否是负数startInclusive 大于 endInclusive 就是负数
final boolean negative = DateTimeUtils.isNegative(startInclusive, endInclusive);
Assert.assertFalse(negative);
// 是否是中午
final boolean noon = DateTimeUtils.isNoon(LocalTime.of(12, 0));
Assert.assertTrue(noon);
// 把纳秒和秒设置为0
final LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 5, 6, 40, 30, 999);
final LocalDateTime time = DateTimeUtils.secondAndNanoSetZero(localDateTime);
Assert.assertEquals(time.toString(), "2020-01-05T06:40");
}
}