首先介绍一下有关日期的相关概念
时区时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。世界各个国家位于地球不同位置上,因此不同国家的日出、日落时间必定有所偏差。这些偏差就是所谓的时差。
来源:https://blog.csdn.net/fanst_/article/details/50627744
GMT:(Greenwich Mean Time)代表格林尼治标准时间
UTC:协调世界时,又称世界标准时间或世界协调时间
CST:被视为美国、澳大利亚、古巴或中国的标准时间
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
CDT:夏令时时间
除此之外还有每个国家自己设定的比如Asia/Shanghai
来看看这些有什么不一样:
UTC:时间戳就是通过UTC的1970-01-01至今算出来的,UTC与GMT+0所表示的时间是一样的都是0时区。
GMT:这个就是咱们比较熟悉的了,平常总是在用,但之前了解都是一星半点。咱们所在北京就是GMT+8的时区,在这个经度上的国家都可以使用GMT+8时区
CST:他同时代表了四个地方的时区,而不同使用场景他表示的就不一样,像在java中CST代表的是中国的,而js好像代表的就是美国的,mysql中CST代表的也是美国的时区。
时间戳:时间戳就是UTC的1970年1月1日到某个时间点走过的毫秒数。他是没有时区的概念的,只是在不同的时区的地方对于同一个时间戳展示的时间也不同,因为时间戳解析出来的是相当于GMT+0的1970-01-01…的时间,但自己的时区不在GMT+0的话,那么时间就不同了。
时令问题也是最近才了解到的。时令是每个国家自己设定的。拿中国举例,在中国的1986年-1991年这6年中实行了时令。就是说为了省电,在夏天的时候,这几年的四月中旬那周的周日会在凌晨2点将时钟向后拨1小时,也就是说在正常2点的这个时刻,如果说支持夏令时看到的就是3点,不支持夏令时看到的就是2点。时区如果是Asia/Shanghai或是中国的CST,那么就是支持夏令时的,看到的时间就是3点,而如果用GMT+8来看的话那就是2点。
来做个时间
public class DateTest {
public static void main(String[] args) throws ParseException {
test1();
System.out.println("================================nn");
test2();
}
public static void test1() throws ParseException {
System.out.println("系统默认时区------->"+ TimeZone.getDefault().getID());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = simpleDateFormat.parse("1988-07-28");
Date date2 = simpleDateFormat.parse("1998-07-28");
System.out.println("使用系统默认时区转换得到时间(在夏令时中)------>"+date1);
System.out.println("使用系统默认时区转换得到时间(不在夏令时中)------>"+date2);
TimeZone timeZone = TimeZone.getTimeZone("GMT+8");
TimeZone.setDefault(timeZone);
System.out.println("时区设置成为------->"+timeZone.getID());
System.out.println("时间转成GMT+8时间(在夏令时中)"+date1);
System.out.println("时间转成GMT+8时间(不在夏令时中)"+date2);
}
public static void test2() throws ParseException {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println("系统默认时区------->"+ TimeZone.getDefault().getID());
long startTime = 586022400000L;
Date date1 = new Date(586022400000L);
Date date2 = new Date(901555200000L);
System.out.println("时间戳转成默认时区的时间(在夏令时中)----->"+date1);
System.out.println("时间戳转成默认时区的时间(不在夏令时中)----->"+date2);
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
System.out.println("时区设置成为------->GMT+8");
System.out.println("时间转成GMT+8时间(在夏令时中)"+date1);
System.out.println("时间转成GMT+8时间(不在夏令时中)"+date2);
}
}
结果:
系统默认时区------->Asia/Shanghai 使用系统默认时区转换得到时间(在夏令时中)------>Thu Jul 28 00:00:00 CDT 1988 使用系统默认时区转换得到时间(不在夏令时中)------>Tue Jul 28 00:00:00 CST 1998 时区设置成为------->GMT+08:00 时间转成GMT+8时间(在夏令时中)Wed Jul 27 23:00:00 GMT+08:00 1988 时间转成GMT+8时间(不在夏令时中)Tue Jul 28 00:00:00 GMT+08:00 1998 ================================ 系统默认时区------->Asia/Shanghai 时间戳转成默认时区的时间(在夏令时中)----->Thu Jul 28 01:00:00 CDT 1988 时间戳转成默认时区的时间(不在夏令时中)----->Tue Jul 28 00:00:00 CST 1998 时区设置成为------->GMT+8 时间转成GMT+8时间(在夏令时中)Thu Jul 28 00:00:00 GMT+08:00 1988 时间转成GMT+8时间(不在夏令时中)Tue Jul 28 00:00:00 GMT+08:00 1998 Process finished with exit code 0
常用的SimpleDateFormat类中有个方法可以设置时区 sdf.setTimeZone(TimeZone.getTimeZone(timeZoneId));
对于parse方法来说:设置的是parse出来的日期是哪个时区的时间
对于format方法来说:设置指定待解析的时间是哪个时区的时间



