java date 线程安全_基于jdk8的java.time的线程安全的DateUtils

工具类如下:

package cn.com.valsong.framework.util;

import java.time.LocalDate;

import java.time.LocalDateTime;

import java.time.LocalTime;

import java.time.Year;

import java.time.YearMonth;

import java.time.ZoneId;

import java.time.format.DateTimeFormatter;

import java.util.Date;

import java.util.Locale;

/**

* 使用ThreadLocal来避免线程安全问题

*

* Date工具类

*

* @author valsong

*

*/

public class DateUtils {

private DateUtils() {

}

private static final ZoneId ZONE_ID = ZoneId.systemDefault();

/**

* LocalDateTime转化为Date

*

* @param localDateTime

* @return

*/

public static Date toDate(LocalDateTime localDateTime) {

return Date.from(localDateTime.atZone(ZONE_ID).toInstant());

}

/**

* LocalDateTime转化为Date

*

* @param localDateTime

* @return

*/

public static Date toDate(LocalDate localDate) {

return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());

}

/**

* Date转化为LocalDateTime

*

* @param date

* @return

*/

public static LocalDateTime toLocalDateTime(Date date) {

return LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);

}

/**

* LocalDate转化为LocalDateTime

*

* @param localDate

* @return

*/

public static LocalDateTime toLocalDateTime(LocalDate localDate) {

return LocalDateTime.of(localDate, LocalTime.MIN);

}

/**

* Date转化为LocalDate

*

* @param date

* @return

*/

public static LocalDate toLocalDate(Date date) {

return date.toInstant().atZone(ZONE_ID).toLocalDate();

}

/**

* Date转化为字符串

*

* @param date

* @param formatter

* @return

*/

public static String format(Date date, DateFormatter formatter) {

LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);

return formatter.getDateTimeFormatter().format(localDateTime);

}

/**

* 字符串转化为Date

*

* @param text

* @param formatter

* @return

*/

public static Date parse(String text, DateFormatter formatter) {

return formatter.parse(text);

}

public static enum DateFormatter {

/**

* 格式yyyy

*

* @author Val Song Dec 17, 2017 7:21:12 PM

*

*/

YEAR_FORMATTER(DateTimeFormatter.ofPattern("yyyy", Locale.CHINA)) {

@Override

public Date parse(String text) {

Year year = Year.parse(text, dateTimeFormatter);

return Date.from(year.atDay(1).atStartOfDay(ZONE_ID).toInstant());

}

},

/**

*

* 格式yyyy-MM

*

* @author Val Song Dec 17, 2017 7:21:30 PM

*

*/

YEAR_MONTH_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM", Locale.CHINA)) {

@Override

public Date parse(String text) {

YearMonth yearMonth = YearMonth.parse(text, dateTimeFormatter);

return Date.from(yearMonth.atDay(1).atStartOfDay(ZONE_ID).toInstant());

}

},

/**

*

* 格式yyyy-MM-dd

*

* @author Val Song Dec 17, 2017 7:26:25 PM

*

*/

DATE_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA)) {

@Override

public Date parse(String text) {

LocalDate localDate = LocalDate.parse(text, dateTimeFormatter);

return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());

}

},

/**

* 格式yyyy-MM-dd HH:mm:ss

*

* @author Val Song Dec 17, 2017 7:26:39 PM

*

*/

DATE_TIME_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA)) {

@Override

public Date parse(String text) {

LocalDateTime localDateTime = LocalDateTime.parse(text, dateTimeFormatter);

return Date.from(localDateTime.atZone(ZONE_ID).toInstant());

}

},

/**

* 格式yyyyMMdd_HHmmss

*

* @author Val Song Dec 17, 2017 7:26:59 PM

*

*/

YYYYMMDD_HHMMSS_FORMATTER(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss", Locale.CHINA)) {

@Override

public Date parse(String text) {

LocalDateTime localDateTime = LocalDateTime.parse(text, dateTimeFormatter);

return Date.from(localDateTime.atZone(ZONE_ID).toInstant());

}

};

protected DateTimeFormatter dateTimeFormatter;

private DateFormatter(DateTimeFormatter dateTimeFormatter) {

this.dateTimeFormatter = dateTimeFormatter;

}

public DateTimeFormatter getDateTimeFormatter() {

return dateTimeFormatter;

}

public abstract Date parse(String text);

}

}

测试类如下:

package cn.com.valsong.framework.util;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.junit.Assert;

import org.junit.Test;

import cn.com.valsong.framework.util.DateUtils.DateFormatter;

/**

* DateUtilsTest

*

* @author Val Song

* Dec 17, 2017 7:38:11 PM

*

*/

public class DateUtilsTest {

private SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");

private SimpleDateFormat yearMonthFormat = new SimpleDateFormat("yyyy-MM");

private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

private SimpleDateFormat yyyyMMdd_HHmmssFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");

@Test

public void formatTest() {

Date now = new Date();

Assert.assertEquals(yearFormat.format(now), DateUtils.format(now, DateFormatter.YEAR_FORMATTER));

Assert.assertEquals(yearMonthFormat.format(now), DateUtils.format(now, DateFormatter.YEAR_MONTH_FORMATTER));

Assert.assertEquals(dateFormat.format(now), DateUtils.format(now, DateFormatter.DATE_FORMATTER));

Assert.assertEquals(dateTimeFormat.format(now), DateUtils.format(now, DateFormatter.DATE_TIME_FORMATTER));

Assert.assertEquals(yyyyMMdd_HHmmssFormat.format(now), DateUtils.format(now, DateFormatter.YYYYMMDD_HHMMSS_FORMATTER));

}

@Test

public void parseTest() throws ParseException {

String yearStr = "2017";

String yearMonthStr = "2017-12";

String dateStr = "2017-12-17";

String dateTimeStr = "2017-12-17 19:47:05";

String yyyyMMdd_HHmmssStr = "20171217_194705";

Assert.assertEquals(yearFormat.parse(yearStr), DateUtils.parse(yearStr, DateFormatter.YEAR_FORMATTER));

Assert.assertEquals(yearMonthFormat.parse(yearMonthStr), DateUtils.parse(yearMonthStr, DateFormatter.YEAR_MONTH_FORMATTER));

Assert.assertEquals(dateFormat.parse(dateStr), DateUtils.parse(dateStr, DateFormatter.DATE_FORMATTER));

Assert.assertEquals(dateTimeFormat.parse(dateTimeStr), DateUtils.parse(dateTimeStr, DateFormatter.DATE_TIME_FORMATTER));

Assert.assertEquals(yyyyMMdd_HHmmssFormat.parse(yyyyMMdd_HHmmssStr), DateUtils.parse(yyyyMMdd_HHmmssStr, DateFormatter.YYYYMMDD_HHMMSS_FORMATTER));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值