mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix code
This commit is contained in:
parent
62c87b28cd
commit
11c370328a
@ -28,9 +28,11 @@ import java.util.Locale;
|
|||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* FastDateFormat 是一个线程安全的 {@link java.text.SimpleDateFormat} 实现:
|
||||||
* FastDateFormat 是一个线程安全的 {@link java.text.SimpleDateFormat} 实现。
|
* <ul>
|
||||||
* </p>
|
* <li>日期字符串解析</li>
|
||||||
|
* <li>日期格式化</li>
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* 通过以下静态方法获得此对象: <br>
|
* 通过以下静态方法获得此对象: <br>
|
||||||
@ -39,20 +41,28 @@ import java.util.TimeZone;
|
|||||||
* {@link #getTimeInstance(int, TimeZone, Locale)}<br>
|
* {@link #getTimeInstance(int, TimeZone, Locale)}<br>
|
||||||
* {@link #getDateTimeInstance(int, int, TimeZone, Locale)}
|
* {@link #getDateTimeInstance(int, int, TimeZone, Locale)}
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* Thanks to Apache Commons Lang 3.5
|
* Thanks to Apache Commons Lang 3.5
|
||||||
|
*
|
||||||
* @since 2.16.2
|
* @since 2.16.2
|
||||||
*/
|
*/
|
||||||
public class FastDateFormat extends Format implements PositionDateParser, DatePrinter {
|
public class FastDateFormat extends Format implements PositionDateParser, DatePrinter {
|
||||||
private static final long serialVersionUID = 8097890768636183236L;
|
private static final long serialVersionUID = 8097890768636183236L;
|
||||||
|
|
||||||
/** FULL locale dependent date or time style. */
|
/**
|
||||||
|
* FULL locale dependent date or time style.
|
||||||
|
*/
|
||||||
public static final int FULL = DateFormat.FULL;
|
public static final int FULL = DateFormat.FULL;
|
||||||
/** LONG locale dependent date or time style. */
|
/**
|
||||||
|
* LONG locale dependent date or time style.
|
||||||
|
*/
|
||||||
public static final int LONG = DateFormat.LONG;
|
public static final int LONG = DateFormat.LONG;
|
||||||
/** MEDIUM locale dependent date or time style. */
|
/**
|
||||||
|
* MEDIUM locale dependent date or time style.
|
||||||
|
*/
|
||||||
public static final int MEDIUM = DateFormat.MEDIUM;
|
public static final int MEDIUM = DateFormat.MEDIUM;
|
||||||
/** SHORT locale dependent date or time style. */
|
/**
|
||||||
|
* SHORT locale dependent date or time style.
|
||||||
|
*/
|
||||||
public static final int SHORT = DateFormat.SHORT;
|
public static final int SHORT = DateFormat.SHORT;
|
||||||
|
|
||||||
private static final FormatCache<FastDateFormat> CACHE = new FormatCache<FastDateFormat>() {
|
private static final FormatCache<FastDateFormat> CACHE = new FormatCache<FastDateFormat>() {
|
||||||
@ -66,6 +76,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
|
|||||||
private final FastDateParser parser;
|
private final FastDateParser parser;
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得 FastDateFormat实例,使用默认格式和地区
|
* 获得 FastDateFormat实例,使用默认格式和地区
|
||||||
*
|
*
|
||||||
@ -128,6 +139,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得 FastDateFormat 实例<br>
|
* 获得 FastDateFormat 实例<br>
|
||||||
* 支持缓存
|
* 支持缓存
|
||||||
@ -177,6 +189,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得 FastDateFormat 实例<br>
|
* 获得 FastDateFormat 实例<br>
|
||||||
* 支持缓存
|
* 支持缓存
|
||||||
@ -226,6 +239,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得 FastDateFormat 实例<br>
|
* 获得 FastDateFormat 实例<br>
|
||||||
* 支持缓存
|
* 支持缓存
|
||||||
@ -279,6 +293,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- Constructor start
|
// ----------------------------------------------------------------------- Constructor start
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造
|
* 构造
|
||||||
*
|
*
|
||||||
@ -395,6 +410,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
|
|||||||
/**
|
/**
|
||||||
* 便捷获取 DateTimeFormatter
|
* 便捷获取 DateTimeFormatter
|
||||||
* 由于 {@link DatePattern} 很大一部分的格式没有提供 {@link DateTimeFormatter},因此这里提供快捷获取方式
|
* 由于 {@link DatePattern} 很大一部分的格式没有提供 {@link DateTimeFormatter},因此这里提供快捷获取方式
|
||||||
|
*
|
||||||
* @return DateTimeFormatter
|
* @return DateTimeFormatter
|
||||||
* @author dazer neusoft
|
* @author dazer neusoft
|
||||||
* @since 5.6.4
|
* @since 5.6.4
|
||||||
|
@ -17,7 +17,7 @@ import org.dromara.hutool.core.date.DateTime;
|
|||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局正则日期解析器<br>
|
* 默认正则日期解析器<br>
|
||||||
* 通过使用预定义或自定义的正则规则,解析日期字符串
|
* 通过使用预定义或自定义的正则规则,解析日期字符串
|
||||||
*
|
*
|
||||||
* @author Looly
|
* @author Looly
|
||||||
|
@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
|
||||||
* Hutool is licensed under Mulan PSL v2.
|
|
||||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
||||||
* You may obtain a copy of Mulan PSL v2 at:
|
|
||||||
* https://license.coscl.org.cn/MulanPSL2
|
|
||||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
||||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the Mulan PSL v2 for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.dromara.hutool.core.date.format.parser;
|
|
||||||
|
|
||||||
import org.dromara.hutool.core.date.DateException;
|
|
||||||
import org.dromara.hutool.core.date.DatePattern;
|
|
||||||
import org.dromara.hutool.core.date.DateTime;
|
|
||||||
import org.dromara.hutool.core.regex.ReUtil;
|
|
||||||
import org.dromara.hutool.core.text.CharUtil;
|
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ISO8601日期字符串(JDK的Date对象toString默认格式)解析,支持格式;
|
|
||||||
* <ol>
|
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ss'Z'</li>
|
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</li>
|
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ssZ</li>
|
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ss.SSSZ</li>
|
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ss+0800</li>
|
|
||||||
* <li>yyyy-MM-dd'T'HH:mm:ss+08:00</li>
|
|
||||||
* </ol>
|
|
||||||
*
|
|
||||||
* @author looly
|
|
||||||
* @since 6.0.0
|
|
||||||
*/
|
|
||||||
public class ISO8601DateParser implements PredicateDateParser, Serializable {
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 单例对象
|
|
||||||
*/
|
|
||||||
public static ISO8601DateParser INSTANCE = new ISO8601DateParser();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean test(final CharSequence dateStr) {
|
|
||||||
return StrUtil.contains(dateStr, 'T');
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DateTime parse(CharSequence source) throws DateException{
|
|
||||||
final int length = source.length();
|
|
||||||
if (StrUtil.contains(source, 'Z')) {
|
|
||||||
if (length == DatePattern.UTC_PATTERN.length() - 4) {
|
|
||||||
// 格式类似:2018-09-13T05:34:31Z,-4表示减去4个单引号的长度
|
|
||||||
return new DateTime(source, DatePattern.UTC_FORMAT);
|
|
||||||
}
|
|
||||||
|
|
||||||
final int patternLength = DatePattern.UTC_MS_PATTERN.length();
|
|
||||||
// 格式类似:2018-09-13T05:34:31.999Z,-4表示减去4个单引号的长度
|
|
||||||
// 2018-09-13T05:34:31.1Z - 2018-09-13T05:34:31.000000Z
|
|
||||||
if (length <= patternLength && length >= patternLength - 6) {
|
|
||||||
// 毫秒部分1-7位支持
|
|
||||||
return new DateTime(source, DatePattern.UTC_MS_FORMAT);
|
|
||||||
}
|
|
||||||
} else if (StrUtil.contains(source, '+')) {
|
|
||||||
// 去除类似2019-06-01T19:45:43 +08:00加号前的空格
|
|
||||||
source = StrUtil.replace(source, " +", "+");
|
|
||||||
final String zoneOffset = StrUtil.subAfter(source, '+', true);
|
|
||||||
if (StrUtil.isBlank(zoneOffset)) {
|
|
||||||
throw new DateException("Invalid format: [{}]", source);
|
|
||||||
}
|
|
||||||
if (!StrUtil.contains(zoneOffset, ':')) {
|
|
||||||
// +0800转换为+08:00
|
|
||||||
final String pre = StrUtil.subBefore(source, '+', true);
|
|
||||||
source = pre + "+" + zoneOffset.substring(0, 2) + ":" + "00";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrUtil.contains(source, CharUtil.DOT)) {
|
|
||||||
// 带毫秒,格式类似:2018-09-13T05:34:31.999+08:00
|
|
||||||
source = normalizeMillSeconds(source, ".", "+");
|
|
||||||
return new DateTime(source, DatePattern.ISO8601_MS_WITH_XXX_OFFSET_FORMAT);
|
|
||||||
} else {
|
|
||||||
// 格式类似:2018-09-13T05:34:31+08:00
|
|
||||||
return new DateTime(source, DatePattern.ISO8601_WITH_XXX_OFFSET_FORMAT);
|
|
||||||
}
|
|
||||||
} else if(ReUtil.contains("-\\d{2}:?00", source)){
|
|
||||||
// Issue#2612,类似 2022-09-14T23:59:00-08:00 或者 2022-09-14T23:59:00-0800
|
|
||||||
|
|
||||||
// 去除类似2019-06-01T19:45:43 -08:00加号前的空格
|
|
||||||
source = StrUtil.replace(source, " -", "-");
|
|
||||||
if(':' != source.charAt(source.length() - 3)){
|
|
||||||
source = StrUtil.sub(source, 0, source.length() - 2) + ":00";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrUtil.contains(source, CharUtil.DOT)) {
|
|
||||||
// 带毫秒,格式类似:2018-09-13T05:34:31.999-08:00
|
|
||||||
source = normalizeMillSeconds(source, ".", "-");
|
|
||||||
return new DateTime(source, DatePattern.ISO8601_MS_WITH_XXX_OFFSET_FORMAT);
|
|
||||||
} else {
|
|
||||||
// 格式类似:2018-09-13T05:34:31-08:00
|
|
||||||
return new DateTime(source, DatePattern.ISO8601_WITH_XXX_OFFSET_FORMAT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (length == DatePattern.ISO8601_PATTERN.length() - 2) {
|
|
||||||
// 格式类似:2018-09-13T05:34:31
|
|
||||||
return new DateTime(source, DatePattern.ISO8601_FORMAT);
|
|
||||||
} else if (length == DatePattern.ISO8601_PATTERN.length() - 5) {
|
|
||||||
// 格式类似:2018-09-13T05:34
|
|
||||||
return new DateTime(source + ":00", DatePattern.ISO8601_FORMAT);
|
|
||||||
} else if (StrUtil.contains(source, CharUtil.DOT)) {
|
|
||||||
// 可能为: 2021-03-17T06:31:33.99
|
|
||||||
source = normalizeMillSeconds(source, ".", null);
|
|
||||||
return new DateTime(source, DatePattern.ISO8601_MS_FORMAT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 没有更多匹配的时间格式
|
|
||||||
throw new DateException("No UTC format fit for date String [{}] !", source);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 如果日期中的毫秒部分超出3位,会导致秒数增加,因此只保留前三位<br>
|
|
||||||
* issue#2887
|
|
||||||
*
|
|
||||||
* @param dateStr 日期字符串
|
|
||||||
* @param before 毫秒部分的前一个字符
|
|
||||||
* @param after 毫秒部分的后一个字符
|
|
||||||
* @return 规范之后的毫秒部分
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("SameParameterValue")
|
|
||||||
private static String normalizeMillSeconds(final CharSequence dateStr, final CharSequence before, final CharSequence after) {
|
|
||||||
if (StrUtil.isBlank(after)) {
|
|
||||||
final String millOrNaco = StrUtil.subPre(StrUtil.subAfter(dateStr, before, true), 3);
|
|
||||||
return StrUtil.subBefore(dateStr, before, true) + before + millOrNaco;
|
|
||||||
}
|
|
||||||
final String millOrNaco = StrUtil.subPre(StrUtil.subBetween(dateStr, before, after), 3);
|
|
||||||
return StrUtil.subBefore(dateStr, before, true)
|
|
||||||
+ before
|
|
||||||
+ millOrNaco + after + StrUtil.subAfter(dateStr, after, true);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
|
||||||
* Hutool is licensed under Mulan PSL v2.
|
|
||||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
||||||
* You may obtain a copy of Mulan PSL v2 at:
|
|
||||||
* https://license.coscl.org.cn/MulanPSL2
|
|
||||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
||||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the Mulan PSL v2 for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.dromara.hutool.core.date.format.parser;
|
|
||||||
|
|
||||||
import org.dromara.hutool.core.date.DateException;
|
|
||||||
import org.dromara.hutool.core.date.DatePattern;
|
|
||||||
import org.dromara.hutool.core.date.DateTime;
|
|
||||||
import org.dromara.hutool.core.regex.ReUtil;
|
|
||||||
import org.dromara.hutool.core.text.CharUtil;
|
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标准日期字符串解析,支持格式;
|
|
||||||
* <pre>
|
|
||||||
* yyyy-MM-dd HH:mm:ss.SSSSSS
|
|
||||||
* yyyy-MM-dd HH:mm:ss.SSS
|
|
||||||
* yyyy-MM-dd HH:mm:ss
|
|
||||||
* yyyy-MM-dd HH:mm
|
|
||||||
* yyyy-MM-dd
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @author looly
|
|
||||||
* @since 6.0.0
|
|
||||||
*/
|
|
||||||
public class NormalDateParser implements PredicateDateParser, Serializable {
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
private static final Pattern patternNorm = Pattern.compile("\\d{4}-\\d{1,2}-\\d{1,2}(\\s\\d{1,2}:\\d{1,2}(:\\d{1,2})?(.\\d{1,6})?)?");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 单例
|
|
||||||
*/
|
|
||||||
public static NormalDateParser INSTANCE = new NormalDateParser();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean test(final CharSequence dateStr) {
|
|
||||||
return ReUtil.isMatch(patternNorm, dateStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DateTime parse(CharSequence source) throws DateException{
|
|
||||||
final int colonCount = StrUtil.count(source, CharUtil.COLON);
|
|
||||||
switch (colonCount) {
|
|
||||||
case 0:
|
|
||||||
// yyyy-MM-dd
|
|
||||||
return new DateTime(source, DatePattern.NORM_DATE_FORMAT);
|
|
||||||
case 1:
|
|
||||||
// yyyy-MM-dd HH:mm
|
|
||||||
return new DateTime(source, DatePattern.NORM_DATETIME_MINUTE_FORMAT);
|
|
||||||
case 2:
|
|
||||||
final int indexOfDot = StrUtil.indexOf(source, CharUtil.DOT);
|
|
||||||
if (indexOfDot > 0) {
|
|
||||||
final int length1 = source.length();
|
|
||||||
// yyyy-MM-dd HH:mm:ss.SSS 或者 yyyy-MM-dd HH:mm:ss.SSSSSS
|
|
||||||
if (length1 - indexOfDot > 4) {
|
|
||||||
// 类似yyyy-MM-dd HH:mm:ss.SSSSSS,采取截断操作
|
|
||||||
source = StrUtil.subPre(source, indexOfDot + 4);
|
|
||||||
}
|
|
||||||
return new DateTime(source, DatePattern.NORM_DATETIME_MS_FORMAT);
|
|
||||||
}
|
|
||||||
// yyyy-MM-dd HH:mm:ss
|
|
||||||
return new DateTime(source, DatePattern.NORM_DATETIME_FORMAT);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new DateException("No format fit for date String [{}] !", source);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
|
||||||
* Hutool is licensed under Mulan PSL v2.
|
|
||||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
||||||
* You may obtain a copy of Mulan PSL v2 at:
|
|
||||||
* https://license.coscl.org.cn/MulanPSL2
|
|
||||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
||||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the Mulan PSL v2 for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.dromara.hutool.core.date.format.parser;
|
|
||||||
|
|
||||||
import org.dromara.hutool.core.date.DateException;
|
|
||||||
import org.dromara.hutool.core.date.DatePattern;
|
|
||||||
import org.dromara.hutool.core.date.DateTime;
|
|
||||||
import org.dromara.hutool.core.math.NumberUtil;
|
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 纯数字的日期字符串解析,支持格式包括;
|
|
||||||
* <ul>
|
|
||||||
* <li>yyyyMMddHHmmss</li>
|
|
||||||
* <li>yyyyMMddHHmmssSSS</li>
|
|
||||||
* <li>yyyyMMdd</li>
|
|
||||||
* <li>HHmmss</li>
|
|
||||||
* <li>毫秒时间戳</li>
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* @author looly
|
|
||||||
* @since 6.0.0
|
|
||||||
*/
|
|
||||||
public class PureDateParser implements PredicateDateParser, Serializable {
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 单例
|
|
||||||
*/
|
|
||||||
public static PureDateParser INSTANCE = new PureDateParser();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean test(final CharSequence dateStr) {
|
|
||||||
return NumberUtil.isNumber(dateStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DateTime parse(final CharSequence source) throws DateException {
|
|
||||||
final int length = source.length();
|
|
||||||
// 纯数字形式
|
|
||||||
if (length == DatePattern.PURE_DATETIME_PATTERN.length()) {
|
|
||||||
return new DateTime(source, DatePattern.PURE_DATETIME_FORMAT);
|
|
||||||
} else if (length == DatePattern.PURE_DATETIME_MS_PATTERN.length()) {
|
|
||||||
return new DateTime(source, DatePattern.PURE_DATETIME_MS_FORMAT);
|
|
||||||
} else if (length == DatePattern.PURE_DATE_PATTERN.length()) {
|
|
||||||
return new DateTime(source, DatePattern.PURE_DATE_FORMAT);
|
|
||||||
} else if (length == DatePattern.PURE_TIME_PATTERN.length()) {
|
|
||||||
return new DateTime(source, DatePattern.PURE_TIME_FORMAT);
|
|
||||||
} else if(length >= 11 && length <= 13){
|
|
||||||
// 时间戳
|
|
||||||
return new DateTime(NumberUtil.parseLong(StrUtil.str(source)));
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new DateException("No pure format fit for date String [{}] !", source);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
|
||||||
* Hutool is licensed under Mulan PSL v2.
|
|
||||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
||||||
* You may obtain a copy of Mulan PSL v2 at:
|
|
||||||
* https://license.coscl.org.cn/MulanPSL2
|
|
||||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
||||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
||||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the Mulan PSL v2 for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.dromara.hutool.core.date.format.parser;
|
|
||||||
|
|
||||||
import org.dromara.hutool.core.date.DatePattern;
|
|
||||||
import org.dromara.hutool.core.date.DateTime;
|
|
||||||
import org.dromara.hutool.core.date.format.FastDateFormat;
|
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RFC2822日期字符串(JDK的Date对象toString默认格式)及HTTP消息日期解析,支持格式类似于;
|
|
||||||
* <pre>
|
|
||||||
* Tue Jun 4 16:25:15 +0800 2019
|
|
||||||
* Thu May 16 17:57:18 GMT+08:00 2019
|
|
||||||
* Wed Aug 01 00:00:00 CST 2012
|
|
||||||
* Thu, 28 Mar 2024 14:33:49 GMT
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @author looly
|
|
||||||
* @since 6.0.0
|
|
||||||
*/
|
|
||||||
public class RFC2822DateParser implements PredicateDateParser, Serializable {
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
private static final String KEYWORDS_LOCALE_CHINA = "星期";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* java.util.Date EEE MMM zzz 缩写数组
|
|
||||||
*/
|
|
||||||
private static final String[] wtb = { //
|
|
||||||
"sun", "mon", "tue", "wed", "thu", "fri", "sat", // 星期
|
|
||||||
"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", // 月份
|
|
||||||
"gmt", "ut", "utc", "est", "edt", "cst", "cdt", "mst", "mdt", "pst", "pdt"// 时间标准
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 单例对象
|
|
||||||
*/
|
|
||||||
public static RFC2822DateParser INSTANCE = new RFC2822DateParser();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean test(final CharSequence dateStr) {
|
|
||||||
return StrUtil.containsAnyIgnoreCase(dateStr, wtb);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DateTime parse(final CharSequence source) {
|
|
||||||
// issue#I9C2D4
|
|
||||||
if (StrUtil.contains(source, ',')) {
|
|
||||||
if (StrUtil.contains(source, KEYWORDS_LOCALE_CHINA)) {
|
|
||||||
// 例如:星期四, 28 三月 2024 14:33:49 GMT
|
|
||||||
return new DateTime(source, FastDateFormat.getInstance(DatePattern.HTTP_DATETIME_PATTERN, Locale.CHINA));
|
|
||||||
}
|
|
||||||
// 例如:Thu, 28 Mar 2024 14:33:49 GMT
|
|
||||||
return new DateTime(source, DatePattern.HTTP_DATETIME_FORMAT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrUtil.contains(source, KEYWORDS_LOCALE_CHINA)) {
|
|
||||||
// 例如:星期四, 28 三月 2024 14:33:49 GMT
|
|
||||||
return new DateTime(source, FastDateFormat.getInstance(DatePattern.JDK_DATETIME_PATTERN, Locale.CHINA));
|
|
||||||
}
|
|
||||||
// 例如:Thu 28 Mar 2024 14:33:49 GMT
|
|
||||||
return new DateTime(source, DatePattern.JDK_DATETIME_FORMAT);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user