在工作过程中,一些业务免不了接触到了一些对时间字符串的处理,整理如下:
转换诸如 “ Wed, 17 Oct 2018 20:17:40 CST”,“ Wed, 17 Oct 2018 20:17:40 BST”等字符时间样式
@Test
public void parseString2Date1()throws Exception{
//首先这种时间格式应该是美国时间的一种格式,因为这里不写上Locale.US"的话,则会抛ParseException异常
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
String cstStr = "Wed, 17 Oct 2018 20:17:40 CST";
String bstStr = "Wed, 17 Oct 2018 20:17:40 BST";
System.out.println(sdf.parse(cstStr));
System.out.println(sdf.parse(bstStr));
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println(sdf.parse(cstStr));
System.out.println(sdf.parse(bstStr));
/*系统时间若为北京时间,则输出结果如下:
Wed Oct 17 20:17:40 CST 2018
Thu Oct 18 03:17:40 CST 2018
Wed Oct 17 20:17:40 CST 2018
Thu Oct 18 03:17:40 CST 2018
*/
/*系统时间若为UTC时间,则输出结果如下:
Thu Oct 18 02:17:40 UTC 2018
Wed Oct 17 19:17:40 UTC 2018
Wed Oct 17 12:17:40 UTC 2018
Wed Oct 17 19:17:40 UTC 2018
*/
}
对上面的结果主要分析如下:
首先,英国的夏令时间(British Summer Time,缩写BST)是从每年3月最后一个星期天开始,至每年10月最后一个星期天结 束。
而一年中的其他时候,用格林尼治标准时间(GMT)。注意的是夏令时BST与UTC 时间相差1小时,也就是与北京时间相差7 个小时。
上面的BST字符串时间,无论是否指定时区,对字符串BST时间不奏效,可以认为字符串BST是自带时区的,并且不可改变。
下面主要分析字符CST时间:
若系统时间为“东8区”即北京时间,则打印结果为: Wed Oct 17 20:17:40 CST 2018
但如果系统换为UTC时间,则结果为: Thu Oct 18 02:17:40 UTC 2018,这里是02时,而不是我预期的12时
后来查了一下CST时间除了代表"中国标准时间",还可以表示"美国、澳大利亚、古巴的标准时间。
第一条打印结果是因为系统时间就在中国时区,系统即认定此处表示的就是CST中国标准时间,所以符合我的预期结果,
而第二条结果是因为系统时间为UTC时间,系统默认为此处的CST时间是“美国时间”(美国有好多种时间,这里不细说),
查了一下,CST美国时间比UTC时间慢了6个小时,所以第二处的结果在原来时间上加上6个小时,变成了第2天的02时,这就
解释的通了,
那么如何在系统时间为UTC时间时,也将CST表示为中国标准时间呢?
只需要指定SimpleDateFormat的时区即可,注意,这里指定时区对BST无影响