因为同事问到了这个问题,当时我也没有很明确的答案,然后写了下测试然后做下笔记,防止自己忘记,也希望可以为跟我拥有同样疑惑的朋友解惑。
关于 SimpleDateFormat 的非线程安全问题及其解决方案
感觉这篇文章说的还不错,就一起整理到这里了
代码执行时间 2017-05-17 17:28
测试代码如下
public class SimpleDateFormatTest {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat();
format.applyPattern("yyyy-MM-dd ");
System.out.println(format.format(date));
format.applyPattern("yyyy-MM-DD ");
System.out.println(format.format(date));
format.applyPattern("YYYY-MM-dd ");
System.out.println(format.format(date));
format.applyPattern("YYYY-MM-DD ");
System.out.println(format.format(date));
format.applyPattern("YYYY-mm-dd :MM");
System.out.println(format.format(date));
}
}
可见结果如下
2017-05-17
2017-05-137
2017-05-17
2017-05-137
2017-28-17 :05
由此可以看出每一个字母在解析的过程中是承担了不同的作用,并不是依赖位置规则的顺序
下面的附录为时间格式化的解析语法
比如最后一个输出的月跟分钟就换了位置,就因为大小写的问题导致的,因为M是月,m是分钟。
static final int PATTERN_ERA = 0; // G
static final int PATTERN_YEAR = 1; // y
static final int PATTERN_MONTH = 2; // M
static final int PATTERN_DAY_OF_MONTH = 3; // d
static final int PATTERN_HOUR_OF_DAY1 = 4; // k
static final int PATTERN_HOUR_OF_DAY0 = 5; // H
static final int PATTERN_MINUTE = 6; // m
static final int PATTERN_SECOND = 7; // s
static final int PATTERN_MILLISECOND = 8; // S
static final int PATTERN_DAY_OF_WEEK = 9; // E
static final int PATTERN_DAY_OF_YEAR = 10; // D
static final int PATTERN_DAY_OF_WEEK_IN_MONTH = 11; // F
static final int PATTERN_WEEK_OF_YEAR = 12; // w
static final int PATTERN_WEEK_OF_MONTH = 13; // W
static final int PATTERN_AM_PM = 14; // a
static final int PATTERN_HOUR1 = 15; // h
static final int PATTERN_HOUR0 = 16; // K
static final int PATTERN_ZONE_NAME = 17; // z
static final int PATTERN_ZONE_VALUE = 18; // Z
static final int PATTERN_WEEK_YEAR = 19; // Y
static final int PATTERN_ISO_DAY_OF_WEEK = 20; // u
static final int PATTERN_ISO_ZONE = 21; // X
static final int PATTERN_MONTH_STANDALONE = 22; // L