Skip to content

Commit

Permalink
springside#525 加强Utils Modules模块 补UT过程中,同样增强日期类的实现
Browse files Browse the repository at this point in the history
calvin1978 committed Jan 9, 2017
1 parent a0042c8 commit 5b69e69
Showing 6 changed files with 76 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -94,7 +94,7 @@ public static String toCsvString(Object... elements) {
/**
* Converts CSV line to string array.
*/
public static String[] toStringArray(String line) {
public static String[] fromCsvString(String line) {
List<String> row = new ArrayList<>();

boolean inQuotedField = false;
Original file line number Diff line number Diff line change
@@ -10,19 +10,21 @@
/**
* hex/base64 编解码工具集,依赖Guava, 取消了对Commmon Codec的依赖
*
* JDK8也有内置的BASE64类.
* 同时,JDK8也有内置的BASE64类.
*/
public class EncodeUtil {

/**
* Hex编码, 默认为abcdef为大写字母.
* Hex编码, 将byte[]编码为String,默认为ABCDEF为大写字母.
*/
public static String encodeHex(byte[] input) {
return BaseEncoding.base16().encode(input);
}

/**
* Hex解码, 字符串有异常时抛出IllegalArgumentException.
* Hex解码, 将String解码为byte[].
*
* 字符串有异常时抛出IllegalArgumentException.
*/
public static byte[] decodeHex(String input) {
return BaseEncoding.base16().decode(input);
Original file line number Diff line number Diff line change
@@ -11,10 +11,14 @@
/**
* Date的parse()与format(), 采用Apache Common Lang中线程安全, 性能更佳的FastDateFormat
*
* 注意Common Lang版本,3.5版才使用StringBuilder,3.4及以前使用StringBuffer.
*
* 1. 常用格式的FastDateFormat定义
*
* 2. 日期格式不固定时的String<->Date 转换函数.
*
* 3. 打印时间间隔,如"01:10:10",以及用户友好的版本,比如"刚刚","10分钟前"
*
* @see FastDateFormat#parse(String)
* @see FastDateFormat#format(java.util.Date)
* @see FastDateFormat#format(long)
@@ -23,24 +27,23 @@ public class DateFormatUtil {

// 以T分隔日期和时间,并带时区信息,符合ISO8601规范
public static final String PATTERN_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";
public static final String PATTERN_ISO_WITH_SECOND = "yyyy-MM-dd'T'HH:mm:ssZZ";
public static final String PATTERN_ISO_WITH_DATE = "yyyy-MM-dd";
public static final String PATTERN_ISO_ON_SECOND = "yyyy-MM-dd'T'HH:mm:ssZZ";
public static final String PATTERN_ISO_ON_DATE = "yyyy-MM-dd";

// 以空格分隔日期和时间,不带时区信息
public static final String PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String PATTERN_DEFAULT_WITH_SECOND = "yyyy-MM-dd HH:mm:ss";
public static final String PATTERN_DEFAULT_ON_SECOND = "yyyy-MM-dd HH:mm:ss";

// 使用工厂方法FastDateFormat.getInstance(), 从缓存中获取实例

// 以T分隔日期和时间,并带时区信息,符合ISO8601规范
public static final FastDateFormat ISO_FORMAT = FastDateFormat.getInstance(PATTERN_ISO);
public static final FastDateFormat ISO_WITH_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_WITH_SECOND);
public static final FastDateFormat ISO_WITH_DATE_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_WITH_DATE);
public static final FastDateFormat ISO_ON_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_SECOND);
public static final FastDateFormat ISO_ON_DATE_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_DATE);

// 以空格分隔日期和时间,不带时区信息
public static final FastDateFormat DEFAULT_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT);
public static final FastDateFormat DEFAULT_WITH_SECOND_FORMAT = FastDateFormat
.getInstance(PATTERN_DEFAULT_WITH_SECOND);
public static final FastDateFormat DEFAULT_ON_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT_ON_SECOND);

/**
* 分析日期字符串, 仅用于pattern不固定的情况.
Original file line number Diff line number Diff line change
@@ -9,6 +9,33 @@ public class CsvUtilTest {
@Test
public void toCsvString() {
assertThat(CsvUtil.toCsvString(1, 2)).isEqualTo("1,2");

// "2" still plain as 2
assertThat(CsvUtil.toCsvString(1, "2")).isEqualTo("1,2");

// "A BC" still plain as A BC
assertThat(CsvUtil.toCsvString(1, "A BC")).isEqualTo("1,A BC");

// "A,BC" has ',' as "A,BC"
assertThat(CsvUtil.toCsvString(1, "A,BC")).isEqualTo("1,\"A,BC\"");

// "A"BC" has '"' as "A""BC"
assertThat(CsvUtil.toCsvString(1, "A\"BC")).isEqualTo("1,\"A\"\"BC\"");

// "A,B"a"C" has 2 '""' as "A,""a""BC"
assertThat(CsvUtil.toCsvString(1, "A,\"a\"BC")).isEqualTo("1,\"A,\"\"a\"\"BC\"");
}

@Test
public void fromCsvString() {
assertThat(CsvUtil.fromCsvString("1,2")).hasSize(2).contains("1").contains("2");
assertThat(CsvUtil.fromCsvString("1,A BC")).hasSize(2).contains("1").contains("A BC");
assertThat(CsvUtil.fromCsvString("1,\"A,BC\"")).hasSize(2).contains("1").contains("A,BC");
assertThat(CsvUtil.fromCsvString("1,\"A,\"\"a\"\"BC\"")).hasSize(2).contains("1").contains("A,\"a\"BC");

// wrong format still work
assertThat(CsvUtil.fromCsvString("1,\"A,\"a\"\"BC\"")).hasSize(2).contains("1").contains("A,\"a\"BC");
assertThat(CsvUtil.fromCsvString("1,ABC\"")).hasSize(2).contains("1").contains("ABC\"");
}

}
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@

import static org.assertj.core.api.Assertions.*;

import org.junit.Assert;
import org.junit.Test;

public class EncodeUtilTest {
@@ -16,13 +17,37 @@ public void hexEncode() {
String input = "haha,i am a very long message";
String result = EncodeUtil.encodeHex(input.getBytes());
assertThat(new String(EncodeUtil.decodeHex(result))).isEqualTo(input);

byte[] bytes = new byte[] { 1, 2, 15, 17 };
result = EncodeUtil.encodeHex(bytes);
assertThat(result).isEqualTo("01020F11");

input = "01020F11";
assertThat(EncodeUtil.decodeHex(input)).hasSize(4).containsSequence((byte) 1, (byte) 2, (byte) 15, (byte) 17);

try {
input = "01020G11";
EncodeUtil.decodeHex(input);
Assert.fail("should throw exception before");
} catch (Throwable t) {
assertThat(t).isInstanceOf(IllegalArgumentException.class);
}

}

@Test
public void base64Encode() {
String input = "haha,i am a very long message";
String result = EncodeUtil.encodeBase64(input.getBytes());
assertThat(new String(EncodeUtil.decodeBase64(result))).isEqualTo(input);

byte[] bytes = new byte[] { 5 };
result = EncodeUtil.encodeBase64(bytes);
assertThat(result).isEqualTo("BQ==");

bytes = new byte[] { 1, 2, 15, 17, 127 };
result = EncodeUtil.encodeBase64(bytes);
assertThat(result).isEqualTo("AQIPEX8=");
}

@Test
Original file line number Diff line number Diff line change
@@ -13,15 +13,15 @@ public class DateFormatUtilTest {
public void isoDateFormat() {
Date date = new Date(116, 10, 1, 12, 23, 44);
assertThat(DateFormatUtil.ISO_FORMAT.format(date)).isEqualTo("2016-11-01T12:23:44.000+08:00");
assertThat(DateFormatUtil.ISO_WITH_SECOND_FORMAT.format(date)).isEqualTo("2016-11-01T12:23:44+08:00");
assertThat(DateFormatUtil.ISO_WITH_DATE_FORMAT.format(date)).isEqualTo("2016-11-01");
assertThat(DateFormatUtil.ISO_ON_SECOND_FORMAT.format(date)).isEqualTo("2016-11-01T12:23:44+08:00");
assertThat(DateFormatUtil.ISO_ON_DATE_FORMAT.format(date)).isEqualTo("2016-11-01");
}

@Test
public void defaultDateFormat() {
Date date = new Date(116, 10, 1, 12, 23, 44);
assertThat(DateFormatUtil.DEFAULT_FORMAT.format(date)).isEqualTo("2016-11-01 12:23:44.000");
assertThat(DateFormatUtil.DEFAULT_WITH_SECOND_FORMAT.format(date)).isEqualTo("2016-11-01 12:23:44");
assertThat(DateFormatUtil.DEFAULT_ON_SECOND_FORMAT.format(date)).isEqualTo("2016-11-01 12:23:44");
}

@Test
@@ -51,7 +51,7 @@ public void formatDuration() {
@Test
public void formatFriendlyTimeSpanByNow() throws ParseException {
try {
Date now = DateFormatUtil.DEFAULT_WITH_SECOND_FORMAT.parse("2016-12-11 23:30:00");
Date now = DateFormatUtil.DEFAULT_ON_SECOND_FORMAT.parse("2016-12-11 23:30:00");

ClockUtil.useDummyClock(now);

@@ -61,16 +61,16 @@ public void formatFriendlyTimeSpanByNow() throws ParseException {
Date lessOneMinute = DateFormatUtil.DEFAULT_FORMAT.parse("2016-12-11 23:29:55.000");
assertThat(DateFormatUtil.formatFriendlyTimeSpanByNow(lessOneMinute)).isEqualTo("5秒前");

Date lessOneHour = DateFormatUtil.DEFAULT_WITH_SECOND_FORMAT.parse("2016-12-11 23:00:00");
Date lessOneHour = DateFormatUtil.DEFAULT_ON_SECOND_FORMAT.parse("2016-12-11 23:00:00");
assertThat(DateFormatUtil.formatFriendlyTimeSpanByNow(lessOneHour)).isEqualTo("30分钟前");

Date today = DateFormatUtil.DEFAULT_WITH_SECOND_FORMAT.parse("2016-12-11 1:00:00");
Date today = DateFormatUtil.DEFAULT_ON_SECOND_FORMAT.parse("2016-12-11 1:00:00");
assertThat(DateFormatUtil.formatFriendlyTimeSpanByNow(today)).isEqualTo("今天01:00");

Date yesterday = DateFormatUtil.DEFAULT_WITH_SECOND_FORMAT.parse("2016-12-10 1:00:00");
Date yesterday = DateFormatUtil.DEFAULT_ON_SECOND_FORMAT.parse("2016-12-10 1:00:00");
assertThat(DateFormatUtil.formatFriendlyTimeSpanByNow(yesterday)).isEqualTo("昨天01:00");

Date threeDayBefore = DateFormatUtil.DEFAULT_WITH_SECOND_FORMAT.parse("2016-12-09 1:00:00");
Date threeDayBefore = DateFormatUtil.DEFAULT_ON_SECOND_FORMAT.parse("2016-12-09 1:00:00");
assertThat(DateFormatUtil.formatFriendlyTimeSpanByNow(threeDayBefore)).isEqualTo("2016-12-09");

} finally {

0 comments on commit 5b69e69

Please sign in to comment.