刘光辉
8 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package jnpf.base.util;
 
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import jnpf.util.DateUtil;
 
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * 时间格式 常量
 */
public class DateTimeFormatConstant {
    DateTimeFormatConstant() {
    }
 
    public static final String YEAR = "yyyy";
    public static final String YEAR_MONTH = "yyyy-MM";
    public static final String YEAR_MONTH_DATE = "yyyy-MM-dd";
    public static final String YEAR_MONTH_DHM = "yyyy-MM-dd HH:mm";
    public static final String YEAR_MONTH_DHMS = "yyyy-MM-dd HH:mm:ss";
    public static final String HOUR_MINUTE = "HH:mm";
    public static final String HOUR_MINUTE_SECOND = "HH:mm:ss";
    private static final Pattern YEAR_PATTERN = Pattern.compile("^\\d{4}$");
    private static final Pattern YEAR_MONTH_PATTERN = Pattern.compile("^(\\d{4})-(\\d{1,2})$");
    private static final Pattern YEAR_MONTH_DATE_PATTERN = Pattern.compile("^(\\d{4})-(\\d{1,2})-(\\d{1,2})$");
 
    /**
     * 时间格式忽略大小写
     *
     * @param otherFormat
     * @return 返回固定格式
     */
    public static String getFormat(String otherFormat) {
        if (YEAR.equalsIgnoreCase(otherFormat)) {
            return YEAR;
        }
        if (YEAR_MONTH.equalsIgnoreCase(otherFormat)) {
            return YEAR_MONTH;
        }
        if (YEAR_MONTH_DATE.equalsIgnoreCase(otherFormat)) {
            return YEAR_MONTH_DATE;
        }
        if (YEAR_MONTH_DHM.equalsIgnoreCase(otherFormat)) {
            return YEAR_MONTH_DHM;
        }
        if (YEAR_MONTH_DHMS.equalsIgnoreCase(otherFormat)) {
            return YEAR_MONTH_DHMS;
        }
        if (HOUR_MINUTE.equalsIgnoreCase(otherFormat)) {
            return HOUR_MINUTE;
        }
        if (HOUR_MINUTE_SECOND.equalsIgnoreCase(otherFormat)) {
            return HOUR_MINUTE_SECOND;
        }
        return otherFormat;
    }
 
    /**
     * 数据库查询时间字段-转换成long
     * 不同数据库查询结果的对象不同
     *
     * @param dateObj
     * @return long
     */
    public static Long getDateObjToLong(Object dateObj) {
        LocalDateTime dateTime = null;
        if (ObjectUtil.isNotEmpty(dateObj)) {
            if (dateObj instanceof LocalDateTime) {
                dateTime = (LocalDateTime) dateObj;
            } else if (dateObj instanceof Timestamp) {
                dateTime = ((Timestamp) dateObj).toLocalDateTime();
            } else if (dateObj instanceof Long) {
                dateTime = LocalDateTimeUtil.of(new Date(Long.parseLong(dateObj.toString())));
            } else {
                String dateText = dateObj.toString().trim();
                try {
                    return OffsetDateTime.parse(dateText.replace(' ', 'T'), DateTimeFormatter.ISO_OFFSET_DATE_TIME)
                            .toInstant().toEpochMilli();
                } catch (DateTimeParseException ignored) {
                    // Legacy date-only and local datetime values use the existing parser.
                }
                dateTime = parseDateText(dateObj.toString());
            }
        }
        return dateTime != null ? DateUtil.localDateTime2Millis(dateTime) : null;
    }
 
    public static boolean isYearMonthText(Object value) {
        return normalizeYearMonthText(value) != null;
    }
 
    public static String normalizeYearMonthText(Object value) {
        if (!(value instanceof String)) {
            return null;
        }
        String dateText = ((String) value).trim().replace("/", "-");
        Matcher yearMonthMatcher = YEAR_MONTH_PATTERN.matcher(dateText);
        if (!yearMonthMatcher.matches()) {
            return null;
        }
        return yearMonthMatcher.group(1) + "-" + padDatePart(yearMonthMatcher.group(2));
    }
 
    private static LocalDateTime parseDateText(String value) {
        String dateText = value == null ? "" : value.trim().replace("/", "-");
        if (dateText.isEmpty()) {
            return null;
        }
        if (YEAR_PATTERN.matcher(dateText).matches()) {
            return LocalDateTime.parse(dateText + "-01-01 00:00:00", DateTimeFormatter.ofPattern(YEAR_MONTH_DHMS));
        }
        String yearMonthText = normalizeYearMonthText(dateText);
        if (yearMonthText != null) {
            return LocalDateTime.parse(yearMonthText + "-01 00:00:00", DateTimeFormatter.ofPattern(YEAR_MONTH_DHMS));
        }
        Matcher yearMonthDateMatcher = YEAR_MONTH_DATE_PATTERN.matcher(dateText);
        if (yearMonthDateMatcher.matches()) {
            return LocalDateTime.parse(yearMonthDateMatcher.group(1) + "-" + padDatePart(yearMonthDateMatcher.group(2)) + "-" + padDatePart(yearMonthDateMatcher.group(3)) + " 00:00:00", DateTimeFormatter.ofPattern(YEAR_MONTH_DHMS));
        }
        return LocalDateTimeUtil.of(cn.hutool.core.date.DateUtil.parse(dateText));
    }
 
    private static String padDatePart(String value) {
        return String.format("%02d", Integer.parseInt(value));
    }
 
}