之前写的一个时间转换工具,分享下
import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
/**
* 时间格式的各种转换
* <p>
* <ul>
* 1.LocalDateTime ----> LocalDate
* 2.LocalDateTime ----> Long
* 3.LocalDateTime ----> Date
* 4.LocalDateTime ----> String
*
* 1.LocalDate ----> LocalDateTime
* 2.LocalDate ----> Long
* 3.LocalDate ----> Date
* 4.LocalDate ----> String
*
* 1.Date ----> LocalDateTime
* 2.Date ----> LocalDate
* 3.Date ----> Long
* 4.Date ----> String
*
* 1.Timestamp ----> LocalDateTime
* 2.Timestamp ----> Long
* 3.Timestamp ----> String
* 4.Timestamp ----> LocalDate
*
* 1.String ----> LocalDateTime
* 2.String ----> LocalDate
* 3.String ----> Date
* 4.String ----> Timestamp
* 5.String ----> LocalTime
* 6.String ----> Time
*
* 1.Long ----> Date
* 2.Long ----> LocalDateTime
* 3.Long ----> LocalDate
* </ul>
* @author shizi
* @since 2020/9/9 8:58 下午
*/
public class LocalDateTimeUtil {
public static final String yMdHmsSSS = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String yMdHmsS = "yyyy-MM-dd HH:mm:ss.S";
public static final String yMdHms = "yyyy-MM-dd HH:mm:ss";
public static final String yMdHm = "yyyy-MM-dd HH:mm";
public static final String yMdH = "yyyy-MM-dd HH";
public static final String yMd = "yyyy-MM-dd";
public static final String yM = "yyyy-MM";
public static final String y = "yyyy";
public static final String HmsSSSMore = "HH:mm:ss.SSSSSSSSS";
public static final String HmsSSS = "HH:mm:ss.SSS";
public static final String Hms = "HH:mm:ss";
public static final String Hm = "HH:mm";
public static final String H = "HH";
private static final Pattern yMdHmsSSSPattern = Pattern.compile("^(\\d){4}-(\\d){2}-(\\d){2} (\\d){2}:(\\d){2}:(\\d){2}.(\\d){3}$");
private static final Pattern yMdHmsSPattern = Pattern.compile("^(\\d){4}-(\\d){2}-(\\d){2} (\\d){2}:(\\d){2}:(\\d){2}.(\\d){1}$");
private static final Pattern yMdHmsPattern = Pattern.compile("^(\\d){4}-(\\d){2}-(\\d){2} (\\d){2}:(\\d){2}:(\\d){2}$");
private static final Pattern yMdHmPattern = Pattern.compile("^(\\d){4}-(\\d){2}-(\\d){2} (\\d){2}:(\\d){2}$");
private static final Pattern yMdHPattern = Pattern.compile("^(\\d){4}-(\\d){2}-(\\d){2} (\\d){2}$");
private static final Pattern yMdPattern = Pattern.compile("^(\\d){4}-(\\d){2}-(\\d){2}$");
private static final Pattern yMPattern = Pattern.compile("^(\\d){4}-(\\d){2}$");
private static final Pattern yPattern = Pattern.compile("^(\\d){4}$");
private static final Map<String, SimpleDateFormat> simpleDateFormat = new ConcurrentHashMap<>(7);
private static final Map<String, DateTimeFormatter> localDateTimeFormat = new ConcurrentHashMap<>(7);
static {
simpleDateFormat.put(yMdHmsSSS, new SimpleDateFormat(yMdHmsSSS));
simpleDateFormat.put(yMdHms, new SimpleDateFormat(yMdHms));
simpleDateFormat.put(yMdHm, new SimpleDateFormat(yMdHm));
simpleDateFormat.put(yMdH, new SimpleDateFormat(yMdH));
simpleDateFormat.put(yMd, new SimpleDateFormat(yMd));
simpleDateFormat.put(yM, new SimpleDateFormat(yM));
simpleDateFormat.put(y, new SimpleDateFormat(y));
localDateTimeFormat.put(yMdHmsSSS, DateTimeFormatter.ofPattern(yMdHmsSSS));
localDateTimeFormat.put(yMdHms, DateTimeFormatter.ofPattern(yMdHms));
localDateTimeFormat.put(yMdHm, DateTimeFormatter.ofPattern(yMdHm));
localDateTimeFormat.put(yMdH, DateTimeFormatter.ofPattern(yMdH));
localDateTimeFormat.put(yMd, DateTimeFormatter.ofPattern(yMd));
localDateTimeFormat.put(yM, DateTimeFormatter.ofPattern(yM));
localDateTimeFormat.put(y, DateTimeFormatter.ofPattern(y));
}
/**
* LocalDateTime 转 LocalDate
*/
private static LocalDate localDateTimeToLocalDate(LocalDateTime localDateTime) {
return localDateTime.toLocalDate();
}
/**
* LocalDateTime 转 Long
*/
public static Long localDateTimeToLong(LocalDateTime localDateTime) {
return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
/**
* LocalDateTime 转 Date
*/
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* LocalDateTime 转 String
*/
public static String localDateTimeToString(LocalDateTime localDateTime) {
return localDateTime.format(localDateTimeFormat.get(yMdHms));
}
/**
* LocalDateTime 转 String
*/
public static String localDateTimeToString(LocalDateTime localDateTime, String dateTimeFormat) {
return localDateTime.format(localDateTimeFormat.get(dateTimeFormat));
}
/**
* LocalDateTime 转 String
*/
public static String localDateTimeToString(LocalDateTime localDateTime, DateTimeFormatter dateTimeFormatter) {
return localDateTime.format(dateTimeFormatter);
}
/**
* LocalDate 转 LocalDateTime
*/
public static LocalDateTime localDateToLocalDateTime(LocalDate localDate) {
return LocalDateTime.of(localDate, LocalTime.parse("00:00:00"));
}
/**
* LocalDate 转 Long
*/
public static Long localDateToLong(LocalDate localDate) {
return localDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
/**
* LocalDate 转 Date
*/
public static Date localDateToDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
/**
* LocalDate 转 String
*/
public static String localDateToString(LocalDate localDate) {
return localDate.format(localDateTimeFormat.get(yMd));
}
/**
* Date 转 LocalDateTime
*/
public static LocalDateTime dateToLocalDateTime(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}
/**
* Date 转 Long
*/
public static Long dateToLong(Date date) {
return date.getTime();
}
/**
* Date 转 LocalDate
*/
public static LocalDate dateToLocalDate(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();
}
/**
* Date 转 String
*/
public static String dateToString(Date date) {
return simpleDateFormat.get(yMdHms).format(date);
}
/**
* Date 转 String
*/
public static String dateToString(Date date, SimpleDateFormat simpleDateFormat) {
return simpleDateFormat.format(date);
}
/**
* Date 转 String
*/
public static String dateToString(Date date, String simpleDateFormatStr) {
return simpleDateFormat.get(simpleDateFormatStr).format(date);
}
/**
* Timestamp 转 LocalDateTime
*/
public static LocalDateTime timestampToLocalDateTime(Timestamp timestamp) {
return timestamp.toLocalDateTime();
}
/**
* Timestamp 转 Long
*/
public static Long timestampToLong(Timestamp timestamp) {
return timestamp.getTime();
}
/**
* Timestamp 转 LocalDate
*/
public static LocalDate timestampToLocalDate(Timestamp timestamp) {
return LocalDateTime.ofInstant(timestamp.toInstant(), ZoneId.systemDefault()).toLocalDate();
}
/**
* Timestamp 转 String
*/
public static String timestampToString(Timestamp timestamp) {
return simpleDateFormat.get(yMdHmsSSS).format(timestamp);
}
/**
* Timestamp 转 String
*/
public static String timestampToString(Timestamp timestamp, SimpleDateFormat simpleDateFormat) {
return simpleDateFormat.format(timestamp);
}
/**
* Timestamp 转 String
*/
public static String timestampToString(Timestamp timestamp, String simpleDateFormatStr) {
return simpleDateFormat.get(simpleDateFormatStr).format(timestamp);
}
/**
* String 转 LocalDateTime
*/
public static LocalDateTime stringToLocalDateTime(String strDateTime) {
return LocalDateTime.parse(strDateTime, DateTimeFormatter.ofPattern(getTimeFormat(strDateTime)));
}
/**
* String 转 LocalDateTime
*/
public static LocalDateTime stringToLocalDateTime(String strDateTime, String formatStr) {
return LocalDateTime.parse(strDateTime, DateTimeFormatter.ofPattern(formatStr));
}
/**
* String 转 LocalDate
*/
public static LocalDate stringToLocalDate(String strDateTime) {
return LocalDate.parse(strDateTime, localDateTimeFormat.get(yMd));
}
/**
* String 转 Date
*/
public static Date stringToDate(String strDateTime) {
try {
return simpleDateFormat.get(getTimeFormat(strDateTime)).parse(strDateTime);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* String 转 Timestamp
*/
public static Timestamp stringToTimestamp(String strDateTime) {
return Timestamp.valueOf(strDateTime);
}
/**
* String 转 LocalTime
*/
public static LocalTime stringToLocalTime(String strDateTime, String datetimeFormat) {
return LocalTime.parse(strDateTime, DateTimeFormatter.ofPattern(datetimeFormat));
}
/**
* String 转 LocalTime
*/
public static LocalTime stringToLocalTime(String strDateTime) {
return LocalTime.parse(strDateTime, DateTimeFormatter.ofPattern(HmsSSS));
}
/**
* String 转 Time
*/
public static Time stringToTime(String strDateTime) {
return Time.valueOf(strDateTime);
}
/**
* Long 转 Date
*/
public static Date longToDate(Long time) {
return new Date(time);
}
/**
* Long 转 LocalDateTime
*/
public static LocalDateTime longToLocalDateTime(Long time) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
}
/**
* Long 转 LocalDate
*/
public static LocalDate longToLocalDate(Long time) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(time),ZoneId.systemDefault()).toLocalDate();
}
private static String getTimeFormat(String strDateTime) {
if (null == strDateTime) {
throw new RuntimeException("获取时间格式错误, time =" + strDateTime);
}
String data;
data = strDateTime.trim();
if ("".equals(data) || "null".equals(data)){
throw new RuntimeException("获取时间格式错误, time =" + strDateTime);
}
String timeFormat = yMdHms;
if (yPattern.matcher(data).matches()) {
timeFormat = y;
} else if (yMPattern.matcher(data).matches()) {
timeFormat = yM;
} else if (yMdPattern.matcher(data).matches()) {
timeFormat = yMd;
} else if (yMdHPattern.matcher(data).matches()) {
timeFormat = yMdH;
} else if (yMdHmPattern.matcher(data).matches()) {
timeFormat = yMdHm;
} else if (yMdHmsPattern.matcher(data).matches()) {
timeFormat = yMdHms;
} else if (yMdHmsSPattern.matcher(data).matches()) {
timeFormat = yMdHmsS;
} else if (yMdHmsSSSPattern.matcher(data).matches()) {
timeFormat = yMdHmsSSS;
}
return timeFormat;
}
}
测试
import org.junit.Assert;
import org.junit.Test;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import static com.simon.ocean.LocalDateTimeUtil.*;
/**
* @author shizi
* @since 2020/10/19 6:44 下午
*/
public class LocalDateTimeUtilTest {
@Test
public void localDateTimeToOtherTest() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 12, 20, 12, 12, 12, 123);
Assert.assertEquals(Long.valueOf(1608437532000L), LocalDateTimeUtil.localDateTimeToLong(localDateTime));
Assert.assertEquals("Sun Dec 20 12:12:12 CST 2020", LocalDateTimeUtil.localDateTimeToDate(localDateTime).toString());
Assert.assertEquals("2020-12-20 12:12:12", LocalDateTimeUtil.localDateTimeToString(localDateTime));
Assert.assertEquals("2020-12-20 12:12:12.000", LocalDateTimeUtil.localDateTimeToString(localDateTime, yMdHmsSSS));
Assert.assertEquals("2020-12-20 12:12:12", LocalDateTimeUtil.localDateTimeToString(localDateTime, yMdHms));
Assert.assertEquals("2020-12-20 12:12", LocalDateTimeUtil.localDateTimeToString(localDateTime, yMdHm));
Assert.assertEquals("2020-12-20 12", LocalDateTimeUtil.localDateTimeToString(localDateTime, yMdH));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.localDateTimeToString(localDateTime, yMd));
Assert.assertEquals("2020-12", LocalDateTimeUtil.localDateTimeToString(localDateTime, yM));
Assert.assertEquals("2020", LocalDateTimeUtil.localDateTimeToString(localDateTime, y));
Assert.assertEquals("2020-12-20 12:12:12.000", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(yMdHmsSSS)));
Assert.assertEquals("2020-12-20 12:12:12", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(yMdHms)));
Assert.assertEquals("2020-12-20 12:12", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(yMdHm)));
Assert.assertEquals("2020-12-20 12", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(yMdH)));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(yMd)));
Assert.assertEquals("2020-12", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(yM)));
Assert.assertEquals("2020", LocalDateTimeUtil.localDateTimeToString(localDateTime, DateTimeFormatter.ofPattern(y)));
}
@Test
public void localDateToOtherTest() {
LocalDate localDate = LocalDate.of(2020, 12, 20);
Date date = LocalDateTimeUtil.stringToDate("2020-12-20");
Assert.assertEquals(date, LocalDateTimeUtil.localDateToDate(localDate));
Assert.assertEquals(Long.valueOf(1608393600000L), LocalDateTimeUtil.localDateToLong(localDate));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.localDateToString(localDate));
LocalDateTime localDateTime = LocalDateTime.of(2020, 12, 20, 0, 0, 0);
Assert.assertEquals(localDateTime, LocalDateTimeUtil.localDateToLocalDateTime(localDate));
}
@Test
public void dateToOtherTest() {
Date date = LocalDateTimeUtil.stringToDate("2020-12-20 12:23:20");
LocalDate localDate = LocalDate.of(2020, 12, 20);
Assert.assertEquals(localDate, LocalDateTimeUtil.dateToLocalDate(date));
LocalDateTime localDateTime = LocalDateTime.of(2020, 12, 20, 12, 23, 20);
Assert.assertEquals(localDateTime, LocalDateTimeUtil.dateToLocalDateTime(date));
Assert.assertEquals("2020-12-20 12:23:20", LocalDateTimeUtil.dateToString(date));
Assert.assertEquals("2020-12-20 12:23:20.000", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(yMdHmsSSS)));
Assert.assertEquals("2020-12-20 12:23:20", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(yMdHms)));
Assert.assertEquals("2020-12-20 12:23", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(yMdHm)));
Assert.assertEquals("2020-12-20 12", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(yMdH)));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(yMd)));
Assert.assertEquals("2020-12", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(yM)));
Assert.assertEquals("2020", LocalDateTimeUtil.dateToString(date, new SimpleDateFormat(y)));
Assert.assertEquals("2020-12-20 12:23:20.000", LocalDateTimeUtil.dateToString(date, yMdHmsSSS));
Assert.assertEquals("2020-12-20 12:23:20", LocalDateTimeUtil.dateToString(date, yMdHms));
Assert.assertEquals("2020-12-20 12:23", LocalDateTimeUtil.dateToString(date, yMdHm));
Assert.assertEquals("2020-12-20 12", LocalDateTimeUtil.dateToString(date, yMdH));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.dateToString(date, yMd));
Assert.assertEquals("2020-12", LocalDateTimeUtil.dateToString(date, yM));
Assert.assertEquals("2020", LocalDateTimeUtil.dateToString(date, y));
}
@Test
public void timestampToOtherTest() {
Date date = LocalDateTimeUtil.stringToDate("2020-12-20 12:23:20.123");
Timestamp timestamp = new Timestamp(date.getTime());
LocalDate localDate = LocalDate.of(2020, 12, 20);
Assert.assertEquals(localDate, LocalDateTimeUtil.timestampToLocalDate(timestamp));
Timestamp timestamp1 = Timestamp.valueOf("2020-12-20 12:23:20.000000123");
LocalDateTime localDateTime = LocalDateTime.of(2020, 12, 20, 12, 23, 20, 123);
Assert.assertEquals(localDateTime, LocalDateTimeUtil.timestampToLocalDateTime(timestamp1));
Assert.assertEquals(Long.valueOf(1608438200000L), LocalDateTimeUtil.timestampToLong(timestamp1));
Assert.assertEquals("2020-12-20 12:23:20.000", LocalDateTimeUtil.timestampToString(timestamp1));
Assert.assertEquals("2020-12-20 12:23:20.000", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(yMdHmsSSS)));
Assert.assertEquals("2020-12-20 12:23:20", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(yMdHms)));
Assert.assertEquals("2020-12-20 12:23", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(yMdHm)));
Assert.assertEquals("2020-12-20 12", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(yMdH)));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(yMd)));
Assert.assertEquals("2020-12", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(yM)));
Assert.assertEquals("2020", LocalDateTimeUtil.timestampToString(timestamp1, new SimpleDateFormat(y)));
Assert.assertEquals("2020-12-20 12:23:20.000", LocalDateTimeUtil.timestampToString(timestamp1, yMdHmsSSS));
Assert.assertEquals("2020-12-20 12:23:20", LocalDateTimeUtil.timestampToString(timestamp1, yMdHms));
Assert.assertEquals("2020-12-20 12:23", LocalDateTimeUtil.timestampToString(timestamp1, yMdHm));
Assert.assertEquals("2020-12-20 12", LocalDateTimeUtil.timestampToString(timestamp1, yMdH));
Assert.assertEquals("2020-12-20", LocalDateTimeUtil.timestampToString(timestamp1, yMd));
Assert.assertEquals("2020-12", LocalDateTimeUtil.timestampToString(timestamp1, yM));
Assert.assertEquals("2020", LocalDateTimeUtil.timestampToString(timestamp1, y));
}
@Test
public void stringToOtherTest() {
String timeStr = "2020-12-20 12:23:20.123";
LocalDateTimeUtil.stringToDate(timeStr);
Date date = LocalDateTimeUtil.stringToDate("2020-12-20 12:23:20.123");
Assert.assertEquals(date, LocalDateTimeUtil.stringToDate(timeStr));
Time time = Time.valueOf("12:23:20");
Assert.assertEquals(time, LocalDateTimeUtil.stringToTime("12:23:20"));
LocalDate localDate = LocalDate.of(2020, 12, 20);
Assert.assertEquals(localDate, LocalDateTimeUtil.stringToLocalDate("2020-12-20"));
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 17, 11, 26, 33);
Assert.assertEquals(localDateTime1, LocalDateTimeUtil.stringToLocalDateTime("2020-10-17 11:26:33"));
LocalDateTime localDateTime2 = LocalDateTime.of(2020, 10, 17, 11, 26, 33, 0);
Assert.assertEquals(localDateTime2, LocalDateTimeUtil.stringToLocalDateTime("2020-10-17 11:26:33.0"));
LocalTime localTime1 = LocalTime.of(12, 23, 20, 123);
Assert.assertEquals(localTime1, LocalDateTimeUtil.stringToLocalTime("12:23:20.000000123", "HH:mm:ss.SSSSSSSSS"));
LocalTime localTime11 = LocalTime.of(12, 23, 20, 0);
Assert.assertEquals(localTime11, LocalDateTimeUtil.stringToLocalTime("12:23:20.000", "HH:mm:ss.SSS"));
LocalTime localTime2 = LocalTime.of(12, 23, 20);
Assert.assertEquals(localTime2, LocalDateTimeUtil.stringToLocalTime("12:23:20", "HH:mm:ss"));
LocalTime localTime3 = LocalTime.of(12, 23);
Assert.assertEquals(localTime3, LocalDateTimeUtil.stringToLocalTime("12:23", "HH:mm"));
Assert.assertEquals(localTime1, LocalDateTimeUtil.stringToLocalTime("12:23:20.000000123", HmsSSSMore));
Assert.assertEquals(localTime11, LocalDateTimeUtil.stringToLocalTime("12:23:20.000", HmsSSS));
Assert.assertEquals(localTime2, LocalDateTimeUtil.stringToLocalTime("12:23:20", Hms));
Assert.assertEquals(localTime3, LocalDateTimeUtil.stringToLocalTime("12:23", Hm));
Timestamp timestamp = Timestamp.valueOf("2020-12-20 12:23:20.000000123");
Assert.assertEquals(timestamp, LocalDateTimeUtil.stringToTimestamp("2020-12-20 12:23:20.000000123"));
}
}
更多工具详见这里
https://github.com/SimonAlong/Doramon