有时在处理一些日期类型的数据时,往往由于不清楚具体是什么类型的格式,导致无法正常的转为Date类型的数据,此处的目的在于写一个能识别常见的一些日期格式,并将其转为Date类型
常见的日期类型格式:
- 20211112(没有分隔符的年月日)
- 2021-11-12(- 分隔符的年月日)
- 2021/11/12(/分隔符的年月日)
- 2021.11.12(.分隔符的年月日)
- 2021年11月12日(中文年月日)
- 2021년11월12일(韩语的年月日)
- 20211112214532(没有任意分隔符,时间具体到秒)
- 202111122145(没有任意分隔符,时间具体到分钟)
- 20211112 22:45:32(日期没有分隔符)
- 2021.11.12 22:45:32 (日期分割符为 .)
- 2021-12-21 23:10:33(常见的yyyy-MM-dd HH:mm:ss)
- 2021/12/4(日为1位数)
- 2021/5/31(月份为1位数)
- 2021/5/3(月份为1位数、日为1位数)
- 2021/5/31 1:25(月份为1位数,时为1位数)
- 2021/5/31 1:2(月份为1位数,时、分为1位数)
- 2021/5/31 12:25(月份为1位数,只有小时和分,没有秒)
- 2021/5/31 12:5(月份为1位数、分钟数为1位数)
- 2021-11-28T22:33:31+0800(UTC时间格式)
- 1638702321(10位秒时间戳)
- 1638702321200(13位毫秒时间戳)
具体实现
详见 toDate() 方法
package top.wys.utils.convert;
/**
* Created by 郑明亮 on 2021/12/3 23:55.
*/
import org.jetbrains.annotations.NotNull;
import top.wys.utils.DateUtils;
import top.wys.utils.NumberUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
/**
* <ol>
* 2021/12/3 23:55 <br>
*
* </ol>
*
* @author 郑明亮
* @version 1.0
*/
public class ConvertUtils {
/**
* 转换为字符串类型的数据
*
* @param obj 要转换类型的对象
* @return
*/
public static String toString(Object obj) {
return toString(obj, null);
}
/**
* 转换为字符串
*
* @param obj 要转换为字符串的对象
* @param defaultValue 当obj为null时,默认返回的值
* @return
*/
public static String toString(Object obj, String defaultValue) {
if (obj == null) {
return defaultValue;
}
return obj.toString();
}
/**
* 转为布尔类型
*
* @param obj
* @return
*/
public static boolean toBoolean(Object obj) {
return toBoolean(obj, null);
}
/**
* 转为布尔类型
*
* @param obj 要转换类型的对象
* @param trueValue 该对象和obj一样时,则返回true
* @return
*/
public static boolean toBoolean(Object obj, Object trueValue) {
if (obj == null) {
return false;
}
if (obj instanceof Boolean) {
return Boolean.TRUE.equals(obj);
}
if (trueValue != null) {
return Objects.equals(obj, trueValue);
}
if (obj instanceof CharSequence) {
return Boolean.parseBoolean(obj.toString());
}
return false;
}
public static Integer toInteger(Object obj) {
return toInteger(obj, null);
}
public static int toInt(Object obj) {
if (obj == null) {
return 0;
}
if (obj instanceof Number) {
return ((Number) obj).intValue();
}
String strValue = obj.toString();
if (obj instanceof CharSequence) {
try {
return new BigDecimal(strValue).intValue();
} catch (NumberFormatException e) {
strValue = getNumberString(strValue);
return new BigDecimal(strValue).intValue();
}
}
return Integer.parseInt(strValue);
}
@NotNull
private static String getNumberString(String strValue) {
char lastChar = strValue.charAt(strValue.length() - 1);
if(NumberUtils.isNotNumber(lastChar)){
strValue = strValue.substring(0, strValue.length() - 1);
}else if(strValue.charAt(0) == '.'){
strValue = "0" + strValue;
}
return strValue;
}
/**
* 转为Integer
*
* @param obj
* @param defaultValue 默认值
* @return
*/
public static Integer toInteger(Object obj, Integer defaultValue) {
if (obj == null) {
return defaultValue;
}
try {
return toInt(obj);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
public static Double toDouble(Object obj) {
return toDouble(obj, null);
}
public static double toDoubleValue(Object obj) {
if (obj == null) {
return 0D;
}
if (obj instanceof Number) {
return ((Number) obj).doubleValue();
}
String strValue = obj.toString();
if (obj instanceof CharSequence) {
try {
return new BigDecimal(strValue).doubleValue();
} catch (NumberFormatException e) {
strValue = getNumberString(strValue);
return new BigDecimal(strValue).intValue();
}
}
return Double.parseDouble(strValue);
}
/**
* 转为Double
*
* @param obj
* @param defaultValue 默认值
* @return
*/
public static Double toDouble(Object obj, Double defaultValue) {
if (obj == null) {
return defaultValue;
}
try {
return toDoubleValue(obj);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
public static Long toLong(Object obj) {
return toLong(obj, null);
}
public static long toLongValue(Object obj) {
if (obj == null) {
return 0L;
}
if (obj instanceof Number) {
return ((Number) obj).longValue();
}
String strValue = obj.toString();
if (obj instanceof CharSequence) {
try {
return new BigDecimal(strValue).longValue();
} catch (NumberFormatException e) {
strValue = getNumberString(strValue);
return new BigDecimal(strValue).longValue();
}
}
long number = Long.parseLong(strValue);
return number;
}
/**
* 转为Long
*
* @param obj
* @param defaultValue 默认值
* @return
*/
public static Long toLong(Object obj, Long defaultValue) {
if (obj == null) {
return defaultValue;
}
try {
return toLongValue(obj);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
/**
* 转为BigDecimal
*
* @param obj
* @return
*/
public static BigDecimal toBigDecimal(Object obj) {
return toBigDecimal(obj,null);
}
/**
* 转为BigDecimal
*
* @param obj
* @param defaultValue 默认值
* @return
*/
public static BigDecimal toBigDecimal(Object obj, BigDecimal defaultValue) {
if (obj == null) {
return defaultValue;
}
try {
return new BigDecimal(obj.toString());
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
/**
* 转换为Date类型
* @param obj
* @return
*/
public static Date toDate(Object obj){
return toDate(obj,null);
}
public static Date toDate(Object obj,Date defaultValue){
if (obj == null) {
return defaultValue;
}
String strValue = obj.toString();
int strLength = strValue.length();
Date date = new Date();
if(obj instanceof Number){
int length = strValue.length();
if(length == 10){
date.setTime(toLong(strValue + "000"));
}else {
date.setTime(((Number) obj).longValue());
}
return date;
}
if(obj instanceof Date){
return (Date) obj;
}
if(obj instanceof java.sql.Date){
date.setTime(((java.sql.Date) obj).getTime());
return date;
}
char[] chars = strValue.toCharArray();
// 判断是否是时间戳
if (strLength == 10 && NumberUtils.isNumber(chars)) {
date.setTime(toLong(strValue + "000"));
return date;
}else if(strLength == 13 && NumberUtils.isNumber(chars)){
date.setTime(toLong(strValue));
return date;
}
// 计算pattern和日期对应配置的偏移量
// 如:yyyy-MM-dd 对于2021-5-2 偏移量为-2, 对于2021-5-12 偏移量为-1 ,对于2021-05-12 偏移量为0
int offset = 0;
StringBuilder pattern = new StringBuilder();
// 2021-11-12 2021/11/12
if (/*(chars[4] == chars[7] && NumberUtils.isNotNumber(chars[4])) ||*/ (NumberUtils.isNotNumber(chars[4]) && NumberUtils.isNotNumber(chars[7]))) {
String split1 = toString(chars[4]);
String split2 = toString(chars[7]);
pattern.append("yyyy").append(split1).append("MM").append(split2).append("dd");
// 2021/5/2
}else if ((NumberUtils.isNotNumber(chars[4]) && NumberUtils.isNotNumber(chars[6]))) {
String split1 = toString(chars[4]);
String split2 = toString(chars[6]);
pattern.append("yyyy").append(split1).append("MM").append(split2).append("dd");
if(strLength > 8){
// 如果第8个字符是数字则说明日期为两位数,否则为一位数
if(NumberUtils.isNumber(chars[8])){
offset = -1;
}else {
offset = -2;
}
}
// 5/11/2021
} else if((NumberUtils.isNotNumber(chars[1]) && NumberUtils.isNotNumber(chars[4]))){
String dateSplit1 = toString(chars[1]);
String dateSplit2 = toString(chars[4]);
pattern.append("dd").append(dateSplit1).append("MM").append(dateSplit2).append("yyyy");
offset = -1;
// 12-5-2021
} else if((NumberUtils.isNotNumber(chars[2]) && NumberUtils.isNotNumber(chars[4]))){
String dateSplit1 = toString(chars[2]);
String dateSplit2 = toString(chars[4]);
pattern.append("dd").append(dateSplit1).append("MM").append(dateSplit2).append("yyyy");
offset = -1;
} else if(/*(chars[3] == chars[6] && NumberUtils.isNotNumber(chars[3])) ||*/ (NumberUtils.isNotNumber(chars[3]) && NumberUtils.isNotNumber(chars[6]))){
String dateSplit1 = toString(chars[3]);
String dateSplit2 = toString(chars[6]);
pattern.append("dd").append(dateSplit1).append("MM").append(dateSplit2).append("yyyy");
} else {
pattern.append("yyyyMMdd");
}
int patternLength = pattern.length();
if(patternLength >= strValue.trim().length()){
return DateUtils.getDateByGiven(strValue, pattern.toString());
}
int nextPosition = patternLength + offset;
if (chars[nextPosition] == ' ') {
pattern.append(" ");
}else if(chars[nextPosition] == 'T'){
pattern.append("'T'");
offset -= 2;
}else if(NumberUtils.isNotNumber(chars[nextPosition])){
pattern.append(toString(chars[nextPosition]));
}
patternLength = pattern.length();
if(patternLength >= strValue.trim().length()){
return DateUtils.getDateByGiven(strValue, pattern.toString());
}
nextPosition = patternLength + offset;
if (strLength >= nextPosition + 6) {
if (chars[nextPosition + 2] == chars[nextPosition + 5] && (!NumberUtils.isNumber(chars[nextPosition + 2]))) {
pattern.append("HH").append(toString(chars[nextPosition + 2])).append("mm").append(toString(chars[nextPosition + 5])).append("ss");
}else {
pattern.append("HHmmss");
}
}else if(strLength >=nextPosition + 3){
// 5:42 或12:5 或者5:3
if(NumberUtils.isNotNumber(chars[nextPosition + 1]) || NumberUtils.isNotNumber(chars[nextPosition + 2])){
pattern.append("HH:mm");
}else{
pattern.append("HHmm");
}
} else {
pattern.append("HHmmss");
}
patternLength = pattern.length();
if(patternLength >= strLength){
return DateUtils.getDateByGiven(strValue, pattern.toString());
}
if (chars[patternLength] == '.') {
pattern.append(".SSS");
}else if(chars[patternLength] == '+' || chars[patternLength] == '-'){
pattern.append("Z");
}
patternLength = pattern.length();
if(patternLength >= strLength){
return DateUtils.getDateByGiven(strValue, pattern.toString());
}
if(chars[patternLength] == '+' || chars[patternLength] == '-'){
pattern.append("Z");
}
return DateUtils.getDateByGiven(strValue, pattern.toString());
}
}
涉及到的NumberUtils.java
/**
* 是否是数字
* @param ch 字符
* @return 是数字返回true,否则返回false
*/
public static boolean isNumber(char ch){
return ch >= '0' && ch <= '9';
}
/**
* 是否是数字
* @param str 字符
* @return 是数字返回true,否则返回false
*/
public static boolean isNumber(String str){
return isNumber(str.toCharArray());
}
/**
* 是否是数字
* @param chars 字符
* @return 是数字返回true,否则返回false
*/
public static boolean isNumber(char[] chars){
for (char ch : chars) {
if(isNotNumber(ch)){
return false;
}
}
return true;
}
/**
* 是否不是数字
* @param ch 字符
* @return 不是数字返回true,否则返回false
*/
public static boolean isNotNumber(char ch){
return !isNumber(ch);
}
/**
* 是否不是数字
* @param str 字符
* @return 不是数字返回true,否则返回false
*/
public static boolean isNotNumber(String str){
return !isNumber(str);
}
单元测试
@Test
public void toDate() {
System.out.println("ConvertUtils.toDate(\"20211112\",null) = " + ConvertUtils.toDate("20211112", null));
System.out.println("ConvertUtils.toDate(\"2021-11-12\",null) = " + ConvertUtils.toDate("2021-11-12", null));
System.out.println("ConvertUtils.toDate(\"2021/11/12\",null) = " + ConvertUtils.toDate("2021/11/12", null));
System.out.println("ConvertUtils.toDate(\"2021年11月12日\",null) = " + ConvertUtils.toDate("2021年11月12日", null));
System.out.println("ConvertUtils.toDate(\"2021년11월12일\",null) = " + ConvertUtils.toDate("2021년11월12일"));//
System.out.println("ConvertUtils.toDate(\"20211112214532\",null) = " + ConvertUtils.toDate("20211112214532", null));
System.out.println("ConvertUtils.toDate(\"20211112 22:45:32\",null) = " + ConvertUtils.toDate("20211112 22:45:32", null));
System.out.println("ConvertUtils.toDate(\"2021.11.12 22:45:32\",null) = " + ConvertUtils.toDate("2021.11.12 22:45:32", null));
System.out.println("ConvertUtils.toDate(\"2021-12-21 23:10:33\") = " + ConvertUtils.toDate("2021-12-21 23:10:33"));
System.out.println("ConvertUtils.toDate(\"2021/12/4\") = " + ConvertUtils.toDate("2021/12/4"));
System.out.println("ConvertUtils.toDate(\"2021/5/31\") = " + ConvertUtils.toDate("2021/5/31"));
System.out.println("ConvertUtils.toDate(\"2021/5/3\") = " + ConvertUtils.toDate("2021/5/3"));
System.out.println("ConvertUtils.toDate(\"2021/12/4 1:25\") = " + ConvertUtils.toDate("2021/5/31 1:25"));
System.out.println("ConvertUtils.toDate(\"2021/12/4 1:2\") = " + ConvertUtils.toDate("2021/5/31 1:2"));
System.out.println("ConvertUtils.toDate(\"2021/12/4 12:25\") = " + ConvertUtils.toDate("2021/5/31 12:25"));
System.out.println("ConvertUtils.toDate(\"2021/12/4 12:5\") = " + ConvertUtils.toDate("2021/5/31 12:5"));
System.out.println("ConvertUtils.toDate(\"2021-11-28T22:33:31+0800\") = " + ConvertUtils.toDate("2021-11-28T22:33:31+0800"));
System.out.println("ConvertUtils.toDate(\"202111122145\") = " + ConvertUtils.toDate("202111122145"));
System.out.println("ConvertUtils.toDate(\"1638702321\") = " + ConvertUtils.toDate("1638702321"));
System.out.println("ConvertUtils.toDate(\"1638702321200\") = " + ConvertUtils.toDate("1638702321200"));
}
运行结果:
ConvertUtils.toDate("20211112",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021-11-12",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021/11/12",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021年11月12日",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021년11월12일",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("20211112214532",null) = Fri Nov 12 21:45:32 CST 2021
ConvertUtils.toDate("20211112 22:45:32",null) = Fri Nov 12 22:45:32 CST 2021
ConvertUtils.toDate("2021.11.12 22:45:32",null) = Fri Nov 12 22:45:32 CST 2021
ConvertUtils.toDate("2021-12-21 23:10:33") = Tue Dec 21 23:10:33 CST 2021
ConvertUtils.toDate("2021/12/4") = Sat Dec 04 00:00:00 CST 2021
ConvertUtils.toDate("2021/5/31") = Mon May 31 00:00:00 CST 2021
ConvertUtils.toDate("2021/5/3") = Mon May 03 00:00:00 CST 2021
ConvertUtils.toDate("2021/12/4 1:25") = Mon May 31 01:25:00 CST 2021
ConvertUtils.toDate("2021/12/4 1:2") = Mon May 31 01:02:00 CST 2021
ConvertUtils.toDate("2021/12/4 12:25") = Mon May 31 12:25:00 CST 2021
ConvertUtils.toDate("2021/12/4 12:5") = Mon May 31 12:05:00 CST 2021
ConvertUtils.toDate("2021-11-28T22:33:31+0800") = Sun Nov 28 22:33:31 CST 2021
ConvertUtils.toDate("202111122145") = Fri Nov 12 21:45:00 CST 2021
ConvertUtils.toDate("1638702321") = Sun Dec 05 19:05:21 CST 2021
ConvertUtils.toDate("1638702321200") = Sun Dec 05 19:05:21 CST 2021
项目依赖
使用maven依赖
<!-- https://mvnrepository.com/artifact/top.wuyongshi/ZmlTools -->
<dependency>
<groupId>top.wuyongshi</groupId>
<artifactId>ZmlTools</artifactId>
<version>1.3.0</version>
</dependency>
使用gradle依赖
// https://mvnrepository.com/artifact/top.wuyongshi/ZmlTools
implementation 'top.wuyongshi:ZmlTools:1.3.0'
Q.E.D.