mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
add parseCST and fix cookie bug
This commit is contained in:
@@ -140,6 +140,7 @@ public class DateTime extends Date {
|
||||
*/
|
||||
public DateTime(Calendar calendar) {
|
||||
this(calendar.getTime(), calendar.getTimeZone());
|
||||
this.setFirstDayOfWeek(Week.of(calendar.getFirstDayOfWeek()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -757,6 +757,24 @@ public class DateUtil {
|
||||
throw new DateException("No format fit for date String [{}] !", utcString);
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析CST时间,格式:<br>
|
||||
* <ol>
|
||||
* <li>EEE MMM dd HH:mm:ss z yyyy(例如:Wed Aug 01 00:00:00 CST 2012)</li>
|
||||
* </ol>
|
||||
*
|
||||
* @param cstString UTC时间
|
||||
* @return 日期对象
|
||||
* @since 4.6.9
|
||||
*/
|
||||
public static DateTime parseCST(String cstString) {
|
||||
if (cstString == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return parse(cstString, DatePattern.JDK_DATETIME_FORMAT);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将日期字符串转换为{@link DateTime}对象,格式:<br>
|
||||
* <ol>
|
||||
@@ -808,8 +826,11 @@ public class DateUtil {
|
||||
// HH:mm:ss 或者 HH:mm 时间格式匹配单独解析
|
||||
return parseTimeToday(dateStr);
|
||||
} else if (StrUtil.containsAnyIgnoreCase(dateStr, wtb)) {
|
||||
// JDK的Date对象toString默认格式,类似于:Tue Jun 4 16:25:15 +0800 2019 或 Thu May 16 17:57:18 GMT+08:00 2019
|
||||
return parse(dateStr, DatePattern.JDK_DATETIME_FORMAT);
|
||||
// JDK的Date对象toString默认格式,类似于:
|
||||
// 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
|
||||
return parseCST(dateStr);
|
||||
} else if (StrUtil.contains(dateStr, 'T')) {
|
||||
// UTC时间
|
||||
return parseUTC(dateStr);
|
||||
|
@@ -23,9 +23,9 @@ import java.util.jar.JarFile;
|
||||
* 类扫描器
|
||||
*
|
||||
* @author looly
|
||||
* @since 4.1.5
|
||||
* @since 4.6.9
|
||||
*/
|
||||
public class ClassScaner implements Serializable {
|
||||
public class ClassScanner implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
@@ -124,13 +124,13 @@ public class ClassScaner implements Serializable {
|
||||
* @return 类集合
|
||||
*/
|
||||
public static Set<Class<?>> scanPackage(String packageName, Filter<Class<?>> classFilter) {
|
||||
return new ClassScaner(packageName, classFilter).scan();
|
||||
return new ClassScanner(packageName, classFilter).scan();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造,默认UTF-8编码
|
||||
*/
|
||||
public ClassScaner() {
|
||||
public ClassScanner() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ public class ClassScaner implements Serializable {
|
||||
*
|
||||
* @param packageName 包名,所有包传入""或者null
|
||||
*/
|
||||
public ClassScaner(String packageName) {
|
||||
public ClassScanner(String packageName) {
|
||||
this(packageName, null);
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ public class ClassScaner implements Serializable {
|
||||
* @param packageName 包名,所有包传入""或者null
|
||||
* @param classFilter 过滤器,无需传入null
|
||||
*/
|
||||
public ClassScaner(String packageName, Filter<Class<?>> classFilter) {
|
||||
public ClassScanner(String packageName, Filter<Class<?>> classFilter) {
|
||||
this(packageName, classFilter, CharsetUtil.CHARSET_UTF_8);
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ public class ClassScaner implements Serializable {
|
||||
* @param classFilter 过滤器,无需传入null
|
||||
* @param charset 编码
|
||||
*/
|
||||
public ClassScaner(String packageName, Filter<Class<?>> classFilter, Charset charset) {
|
||||
public ClassScanner(String packageName, Filter<Class<?>> classFilter, Charset charset) {
|
||||
packageName = StrUtil.nullToEmpty(packageName);
|
||||
this.packageName = packageName;
|
||||
this.packageNameWithDot = StrUtil.addSuffixIfNot(packageName, StrUtil.DOT);
|
@@ -26,7 +26,7 @@ public class NamedThreadFactory implements ThreadFactory {
|
||||
/** 线程组 */
|
||||
private final AtomicInteger threadNumber = new AtomicInteger(1);
|
||||
/** 是否守护线程 */
|
||||
private final boolean isDeamon;
|
||||
private final boolean isDaemon;
|
||||
/** 无法捕获的异常统一处理 */
|
||||
private final UncaughtExceptionHandler handler;
|
||||
|
||||
@@ -34,10 +34,10 @@ public class NamedThreadFactory implements ThreadFactory {
|
||||
* 构造
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
*/
|
||||
public NamedThreadFactory(String prefix, boolean isDeamon) {
|
||||
this(prefix, null, isDeamon);
|
||||
public NamedThreadFactory(String prefix, boolean isDaemon) {
|
||||
this(prefix, null, isDaemon);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -45,10 +45,10 @@ public class NamedThreadFactory implements ThreadFactory {
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
*/
|
||||
public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon) {
|
||||
this(prefix, threadGroup, isDeamon, null);
|
||||
public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon) {
|
||||
this(prefix, threadGroup, isDaemon, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -56,16 +56,16 @@ public class NamedThreadFactory implements ThreadFactory {
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param handler 未捕获异常处理
|
||||
*/
|
||||
public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon, UncaughtExceptionHandler handler) {
|
||||
public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon, UncaughtExceptionHandler handler) {
|
||||
this.prefix = StrUtil.isBlank(prefix) ? "Hutool" : prefix;
|
||||
if (null == threadGroup) {
|
||||
threadGroup = ThreadUtil.currentThreadGroup();
|
||||
}
|
||||
this.group = threadGroup;
|
||||
this.isDeamon = isDeamon;
|
||||
this.isDaemon = isDaemon;
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
@@ -75,11 +75,11 @@ public class NamedThreadFactory implements ThreadFactory {
|
||||
|
||||
//守护线程
|
||||
if (false == t.isDaemon()) {
|
||||
if (isDeamon) {
|
||||
if (isDaemon) {
|
||||
// 原线程为非守护则设置为守护
|
||||
t.setDaemon(true);
|
||||
}
|
||||
} else if (false == isDeamon) {
|
||||
} else if (false == isDaemon) {
|
||||
// 原线程为守护则还原为非守护
|
||||
t.setDaemon(false);
|
||||
}
|
||||
|
@@ -98,17 +98,17 @@ public class ThreadUtil {
|
||||
* 执行异步方法
|
||||
*
|
||||
* @param runnable 需要执行的方法体
|
||||
* @param isDeamon 是否守护线程。守护线程会在主线程结束后自动结束
|
||||
* @param isDaemon 是否守护线程。守护线程会在主线程结束后自动结束
|
||||
* @return 执行的方法体
|
||||
*/
|
||||
public static Runnable excAsync(final Runnable runnable, boolean isDeamon) {
|
||||
public static Runnable excAsync(final Runnable runnable, boolean isDaemon) {
|
||||
Thread thread = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
runnable.run();
|
||||
}
|
||||
};
|
||||
thread.setDaemon(isDeamon);
|
||||
thread.setDaemon(isDaemon);
|
||||
thread.start();
|
||||
|
||||
return runnable;
|
||||
@@ -192,13 +192,13 @@ public class ThreadUtil {
|
||||
*
|
||||
* @param runnable {@link Runnable}
|
||||
* @param name 线程名
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link Thread}
|
||||
* @since 4.1.2
|
||||
*/
|
||||
public static Thread newThread(Runnable runnable, String name, boolean isDeamon) {
|
||||
public static Thread newThread(Runnable runnable, String name, boolean isDaemon) {
|
||||
final Thread t = new Thread(null, runnable, name);
|
||||
t.setDaemon(isDeamon);
|
||||
t.setDaemon(isDaemon);
|
||||
return t;
|
||||
}
|
||||
|
||||
@@ -396,11 +396,11 @@ public class ThreadUtil {
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDeamon) {
|
||||
return new NamedThreadFactory(prefix, isDeamon);
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDaemon) {
|
||||
return new NamedThreadFactory(prefix, isDaemon);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -408,11 +408,11 @@ public class ThreadUtil {
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon) {
|
||||
return new NamedThreadFactory(prefix, threadGroup, isDeamon);
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon) {
|
||||
return new NamedThreadFactory(prefix, threadGroup, isDaemon);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -420,12 +420,12 @@ public class ThreadUtil {
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDeamon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param handler 未捕获异常处理
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon, UncaughtExceptionHandler handler) {
|
||||
return new NamedThreadFactory(prefix, threadGroup, isDeamon, handler);
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon, UncaughtExceptionHandler handler) {
|
||||
return new NamedThreadFactory(prefix, threadGroup, isDaemon, handler);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -21,7 +21,7 @@ import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.io.IORuntimeException;
|
||||
import cn.hutool.core.io.resource.ResourceUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.lang.ClassScaner;
|
||||
import cn.hutool.core.lang.ClassScanner;
|
||||
import cn.hutool.core.lang.Filter;
|
||||
import cn.hutool.core.lang.Singleton;
|
||||
|
||||
@@ -176,10 +176,10 @@ public class ClassUtil {
|
||||
* @param packageName 包路径
|
||||
* @param annotationClass 注解类
|
||||
* @return 类集合
|
||||
* @see ClassScaner#scanPackageByAnnotation(String, Class)
|
||||
* @see ClassScanner#scanPackageByAnnotation(String, Class)
|
||||
*/
|
||||
public static Set<Class<?>> scanPackageByAnnotation(String packageName, final Class<? extends Annotation> annotationClass) {
|
||||
return ClassScaner.scanPackageByAnnotation(packageName, annotationClass);
|
||||
return ClassScanner.scanPackageByAnnotation(packageName, annotationClass);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -188,20 +188,20 @@ public class ClassUtil {
|
||||
* @param packageName 包路径
|
||||
* @param superClass 父类或接口
|
||||
* @return 类集合
|
||||
* @see ClassScaner#scanPackageBySuper(String, Class)
|
||||
* @see ClassScanner#scanPackageBySuper(String, Class)
|
||||
*/
|
||||
public static Set<Class<?>> scanPackageBySuper(String packageName, final Class<?> superClass) {
|
||||
return ClassScaner.scanPackageBySuper(packageName, superClass);
|
||||
return ClassScanner.scanPackageBySuper(packageName, superClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫面该包路径下所有class文件
|
||||
*
|
||||
* @return 类集合
|
||||
* @see ClassScaner#scanPackage()
|
||||
* @see ClassScanner#scanPackage()
|
||||
*/
|
||||
public static Set<Class<?>> scanPackage() {
|
||||
return ClassScaner.scanPackage();
|
||||
return ClassScanner.scanPackage();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -209,10 +209,10 @@ public class ClassUtil {
|
||||
*
|
||||
* @param packageName 包路径 com | com. | com.abs | com.abs.
|
||||
* @return 类集合
|
||||
* @see ClassScaner#scanPackage(String)
|
||||
* @see ClassScanner#scanPackage(String)
|
||||
*/
|
||||
public static Set<Class<?>> scanPackage(String packageName) {
|
||||
return ClassScaner.scanPackage(packageName);
|
||||
return ClassScanner.scanPackage(packageName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,7 +225,7 @@ public class ClassUtil {
|
||||
* @return 类集合
|
||||
*/
|
||||
public static Set<Class<?>> scanPackage(String packageName, Filter<Class<?>> classFilter) {
|
||||
return ClassScaner.scanPackage(packageName, classFilter);
|
||||
return ClassScanner.scanPackage(packageName, classFilter);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------- Method
|
||||
|
@@ -585,10 +585,7 @@ public class StrUtil {
|
||||
*/
|
||||
public static boolean startWith(CharSequence str, CharSequence prefix, boolean isIgnoreCase) {
|
||||
if (null == str || null == prefix) {
|
||||
if (null == str && null == prefix) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return null == str && null == prefix;
|
||||
}
|
||||
|
||||
if (isIgnoreCase) {
|
||||
@@ -664,10 +661,7 @@ public class StrUtil {
|
||||
*/
|
||||
public static boolean endWith(CharSequence str, CharSequence suffix, boolean isIgnoreCase) {
|
||||
if (null == str || null == suffix) {
|
||||
if (null == str && null == suffix) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return null == str && null == suffix;
|
||||
}
|
||||
|
||||
if (isIgnoreCase) {
|
||||
@@ -3831,7 +3825,7 @@ public class StrUtil {
|
||||
}
|
||||
|
||||
int preIndex = fromIndex;
|
||||
int index = fromIndex;
|
||||
int index;
|
||||
while ((index = indexOf(str, searchStr, preIndex, ignoreCase)) > -1) {
|
||||
result.append(str.subSequence(preIndex, index));
|
||||
result.append(replacement);
|
||||
@@ -3985,7 +3979,7 @@ public class StrUtil {
|
||||
*
|
||||
* @param str1 字符串1
|
||||
* @param str2 字符串2
|
||||
* @param scale
|
||||
* @param scale 相似度
|
||||
* @return 相似度百分比
|
||||
* @since 3.2.3
|
||||
*/
|
||||
|
@@ -213,6 +213,20 @@ public class URLUtil {
|
||||
return urls;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取URL中域名部分
|
||||
*
|
||||
* @param url URL
|
||||
* @return 域名的URI
|
||||
* @since 4.6.9
|
||||
*/
|
||||
public static URI getHost(URL url){
|
||||
if(null == url){
|
||||
return null;
|
||||
}
|
||||
return toURI(url.getHost());
|
||||
}
|
||||
|
||||
/**
|
||||
* 补全相对路径
|
||||
*
|
||||
|
@@ -2,6 +2,7 @@ package cn.hutool.core.date;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.BetweenFormater.Level;
|
||||
import cn.hutool.core.lang.Console;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -472,6 +473,16 @@ public class DateUtilTest {
|
||||
Assert.assertEquals("2018-09-13 13:34:39.999", dateStr);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void parseCSTTest(){
|
||||
String dateStr = "Wed Sep 16 11:26:23 CST 2009";
|
||||
DateTime dateTime = DateUtil.parseCST(dateStr);
|
||||
Assert.assertEquals("2009-09-17 01:26:23", dateTime.toString());
|
||||
|
||||
dateTime = DateUtil.parse(dateStr);
|
||||
Assert.assertEquals("2009-09-17 01:26:23", dateTime.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void parseJDkTest() {
|
||||
String dateStr = "Thu May 16 17:57:18 GMT+08:00 2019";
|
||||
|
@@ -10,7 +10,7 @@ public class ClassScanerTest {
|
||||
@Test
|
||||
@Ignore
|
||||
public void scanTest() {
|
||||
ClassScaner scaner = new ClassScaner("cn.hutool.core.util", null);
|
||||
ClassScanner scaner = new ClassScanner("cn.hutool.core.util", null);
|
||||
Set<Class<?>> set = scaner.scan();
|
||||
for (Class<?> clazz : set) {
|
||||
Console.log(clazz.getName());
|
||||
|
@@ -1,8 +1,13 @@
|
||||
package cn.hutool.core.util;
|
||||
|
||||
import cn.hutool.core.lang.Console;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* URLUtil单元测试
|
||||
*
|
||||
@@ -54,7 +59,15 @@ public class URLUtilTest {
|
||||
String normalize = URLUtil.normalize(url);
|
||||
Assert.assertEquals("http://www.hutool.cn/aaa/bbb?a=1&b=2", normalize);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void getHostTest() throws MalformedURLException {
|
||||
String url = "//www.hutool.cn//aaa/\\bbb?a=1&b=2";
|
||||
String normalize = URLUtil.normalize(url);
|
||||
URI host = URLUtil.getHost(new URL(normalize));
|
||||
Assert.assertEquals("www.hutool.cn", host.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void encodeTest() {
|
||||
String body = "366466 - 副本.jpg";
|
||||
|
Reference in New Issue
Block a user