diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 66a04dd25..8721291f7 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -635,6 +635,57 @@ public class DateUtil extends CalendarUtil { return CalendarUtil.formatChineseDate(CalendarUtil.calendar(date), withTime); } + + + /** + * 返回可读的时间间隔,如1天20小时3分48秒 + * @param milliSecond 毫秒 + * @author zrh 455741807@qq.com + * @return + */ + public static String formatDuring(long milliSecond) { + final int i1000=1000; + if (milliSecond <= 0) { + return "小于1毫秒"; + } + if (milliSecond < i1000) { + return milliSecond + "毫秒"; + } + String result = ""; + long days = milliSecond / (1000 * 60 * 60 * 24); + long hours = (milliSecond % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + long minutes = (milliSecond % (1000 * 60 * 60)) / (1000 * 60); + long seconds = (milliSecond % (1000 * 60)) / 1000; + if (days > 0) { + result += days + "天"; + } + if (hours > 0) { + result += hours + "小时"; + } + if (minutes > 0) { + result += minutes + "分"; + } + if (seconds >= 0) { + result += seconds + "秒"; + } + return result; + } + + /** + * 返回两个日期之间间隔时间 + * @param begin 开始日期 + * @param end 结束日期 + * @author zrh 455741807@qq.com + * @return + */ + public static String formatDuring(Date begin, Date end) { + if(begin == null || end == null) { + return ""; + } + return formatDuring(end.getTime()-begin.getTime()); + } + + // ------------------------------------ Format end ---------------------------------------------- // ------------------------------------ Parse start ---------------------------------------------- diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 3984bf599..c0f1f72c8 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -97,6 +97,29 @@ public class DateUtilTest { Assert.assertEquals(date, parse); } + + @Test + public void formatDuring() { + long d = 56123456; + String s = DateUtil.formatDuring(d); + Assert.assertEquals("15小时35分23秒", s); + } + + @Test + public void testFormatDuring() { + Calendar c = Calendar.getInstance(); + Date s = c.getTime(); + + c.add(Calendar.DAY_OF_MONTH, 1); + c.add(Calendar.MINUTE, 2); + c.add(Calendar.SECOND, 3); + Date e = c.getTime(); + + String str = DateUtil.formatDuring(s, e); + + Assert.assertEquals("1天2分3秒", str); + } + @Test public void beginAndEndTest() { String dateStr = "2017-03-01 00:33:23"; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java index 0b437a8f3..95b1039bf 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java @@ -44,6 +44,11 @@ public class JSONConfig implements Serializable { */ private boolean stripTrailingZeros = true; + /** + * 是否忽略多个相同的key + */ + private boolean ignoreDuplicateKey = false; + /** * 创建默认的配置项 * @@ -235,4 +240,22 @@ public class JSONConfig implements Serializable { this.stripTrailingZeros = stripTrailingZeros; return this; } + + /** + * 是否忽略多个相同的key + * @return + */ + public boolean isIgnoreDuplicateKey() { + return ignoreDuplicateKey; + } + + /** + * 是否忽略多个相同的key + * @param ignoreDuplicateKey + * @return + */ + public JSONConfig setIgnoreDuplicateKey(boolean ignoreDuplicateKey) { + this.ignoreDuplicateKey = ignoreDuplicateKey; + return this; + } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 921d19df8..1704c8daa 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -392,7 +392,9 @@ public class JSONObject extends MapWrapper implements JSON, JSON // 忽略值模式下如果值为空清除key this.remove(key); } else { - if (checkDuplicate && containsKey(key)) { + /*如果允许多个key,就不抛出异常,使用后面的值覆盖前面的值*/ + boolean ignoreDuplicateKey = this.config.isIgnoreDuplicateKey(); + if (checkDuplicate && containsKey(key) && false == ignoreDuplicateKey) { throw new JSONException("Duplicate key \"{}\"", key); } diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java index 3be9a3fbb..5f2e8bb41 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java @@ -234,4 +234,14 @@ public class JSONUtilTest { final String xmlStr = JSONUtil.toXmlStr(obj); Assert.assertEquals("v1abc", xmlStr); } + + @Test + public void testDuplicateKey(){ + String str = "{id:123, name:\"张三\", name:\"李四\"}"; + + JSONObject jsonObject = JSONUtil.parseObj(str, JSONConfig.create().setIgnoreDuplicateKey(true)); + System.out.println(jsonObject.toString()); + + Assert.assertNotNull(jsonObject); + } }