文章总结自Hollis的知识星球,直面Java版块,公众号Hollis,转侵删
1.什么是时区,北京时间和洛杉矶时间差多少个小时,北京时间和美国纽约时间差多少个小时
时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。这些偏差就是所谓的时差。
为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。这样使用起来就很方便。现今全球共分为24个时区。由于实用上常常1个国家,或1个省份同时跨着2个或更多时区,为了照顾到行政上的方便,常将1个国家或1个省份划在一起。所以时区并不严格按南北直线来划分,而是按自然条件来划分。例如,中国幅员宽广,差不多跨5个时区,但为了使用方便简单,实际上在只用东八时区的标准时即北京时间为准。
北京时间比洛杉矶时间早15或者16个小时。具体和时令有关。
北京时间比纽约时间早12或者13个小时。具体和时令有关。
2.什么是冬令时?什么是夏令时?
冬令时北京时间和美国洛杉矶时间差多少个小时?
夏令时北京时间和美国洛杉矶时间差多少个小时?
冬令时北京时间和美国纽约时间差几个小时?
夏令时北京时间和美国洛杉矶时间差多少个小时?
3.什么是格林威治时间?
格林尼治平时(英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线。
自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。
格林尼治平时的正午是指当平太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。
一般使用GMT+8表示中国的时间,是因为中国位于东八区,时间上比格林威治时间快8个小时。
4.CET,UTC,GMT,CST几种常见时间的含义和关系?
CET :欧洲中部时间(英語:Central European Time,CET)是比世界标准时间(UTC)早一个小时的时区名称之一。它被大部分欧洲国家和部分北非国家采用。冬季时间为UTC+1,夏季欧洲夏令时为UTC+2。
参考资料:http://zh.wikipedia.org/zh/%E6%AC%A7%E6%B4%B2%E4%B8%AD%E9%83%A8%E6%97%B6%E9%97%B4
UTC :协调世界时,又称世界标准时间或世界协调时间,简称UTC,从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来。台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》(与ISO 8601类似)称之为世界统一时间。中国大陆采用ISO 8601-1988的国标《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408)中称之为国际协调时间。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
参考资料http://zh.wikipedia.org/zhhans/%E4%B8%96%E7%95%8C%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4
GMT: 格林尼治标准时间(旧译格林尼治平均时间或格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 参考资料:http://zh.wikipedia.org/wiki/GMT CST 北京时间,China Standard Time,又名中国标准时间,是中国的标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8,与中华民国国家标准时间(旧称“中原标准时间”)、香港时间和澳门时间和相同。當格林威治時間為凌晨0:00時,中國標準時間剛好為上午8:00。
参考资料:http://zh.wikipedia.org/zh/CSThttp://zh.wikipedia.org/wiki/%E5%8C%97%E4%BA%AC%E6%97%B6%E9%97%B4
关系 :
CET=UTC/GMT + 1小时
CST=UTC/GMT +8 小时
CST=CET+9
5.什么是时间戳?
时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
6.为什么在有些系统出现问题的时候,时间会显示成:Thu Jan 01 08:00:00 CST 1970 或者 1970-01-01 08:00:00
当有些计算机存储或者传输 Timestamp 出错时,这个 Timestamp 就会取默认值。而在计算机中,默认值通常是 0。
当 Timestamp 为 0,就表示时间(GMT)1970年1月1日0时0分0秒。中国使用北京时间,处于东 8 区,相应就是早上 8 点。因此在中国这边,时间出错了,就经常会显示成 1970年1月1日 08:00。
7.Java中Timestamp和Date之间如何相互转换。
public class Date2Timestamp {
public static void main(String[] args) {
//1.java.util.Date转化为java.sql.Timestamp
Date date = new Date();
System.out.println(date);
long time = date.getTime();
System.out.println(time);
//java.sql.Timestamp
Timestamp timestamp = new Timestamp(date.getTime());
System.out.println(timestamp);
//2.java.sql.Timestamp转换为java.util.Date
Timestamp timestamp1 = new Timestamp(System.currentTimeMillis());
long time1 = timestamp1.getTime();
System.out.println(time1);
Date date1 = new Date(time1);
System.out.println(date1);
}
}
//1.java.util.Date转化为java.sql.Timestamp
Mon Dec 03 19:28:11 CST 2018
1543836491253
2018-12-03 19:28:11.253
//2.java.sql.Timestamp转换为java.util.Date
1543836491270
Mon Dec 03 19:28:11 CST 2018
8.Java 8之前,Java中如何获取系统的当前时间。
1、
Date date = new Date();
2、
Calendar c1=Calendar.getInstance();
c1.getTime();
9.什么是Calendar
从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。 Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
1、使用Calendar类代表当前时间
Calendar c = Calendar.getInstance();
由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。 使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。
2、使用Calendar类代表指定的时间
Calendar c1 = Calendar.getInstance();
c1.set(2018, 11 , 11);
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
10.Calendar如何获取当前时间
Calendar ca=Calendar.getInstance();
Date d =(Date) ca.getTime();
11.如何在Date和String之间相互转换
最简单的方式就是使用SimpleDateFormat。SimpleDateFormat是Java提供的一个格式化和解析日期的工具类。
public class Date2String {
public static void main(String[] args) throws ParseException {
//Date to String
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
System.out.println(dateStr);
//String to Date
Date parseDate = sdf.parse(dateStr);
System.out.println(parseDate);
}
}
2018-12-04 09:28:20
Tue Dec 04 09:28:20 CST 2018
12 SimpleDateFormat是线程安全的吗?使用时应该注意什么?
SimpleDateFormat是非线程安全的,所以在多线程场景中,不能使用SimpleDateFormat作为共享变量。
解决方法大概有以下几类:
1.各线程间不共享SimpleDateFormat,在使用到的时候再创建(可能会大量的创建销毁对象)
2.对SimpleDateFormat进行同步处理;
3.使用ThreadLocal
4.使用线程安全的第三方类库,例如:Apache commons 里的FastDateFormat,Joda-Time类库等
12.Java中,如何获取一年(一个月、一周、一天)后的时间?
在Java 8之前,使用Calendar 来获取。
public class GetDateByCalendar {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = new Date();
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
calendar.setTime(date);
//增加一天
calendar.add(Calendar.DAY_OF_YEAR,1);
//增加一天
calendar.add(Calendar.DAY_OF_MONTH,1);
//增加一天
calendar.add(Calendar.DAY_OF_WEEK,1);
//增加一天
calendar.add(Calendar.DATE,1);
//Sat Dec 08 09:50:20 CST 2018
//今天12-04 结果是12-08
System.out.println(calendar.getTime());
//增加一周
calendar.add(Calendar.WEEK_OF_YEAR,1);
//增加一周
calendar.add(Calendar.WEEK_OF_MONTH,1);
//Sat Dec 22 09:54:34 CST 2018
//12-22
System.out.println(calendar.getTime());
//增加一个月
calendar.add(Calendar.MONTH,1);
//Tue Jan 22 09:57:38 CST 2019
//2019-1-22
System.out.println(calendar.getTime());
//增加一年
calendar.add(Calendar.YEAR,1);
//Wed Jan 22 09:57:38 CST 2020
//2020-1-22
System.out.println(calendar.getTime());
}
}
在Java 8之后,可以使用LocalDateTime
public class GetDateByLocalDateTime {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime dates = now.plusDays(1);
LocalDateTime weeks = now.plusWeeks(1);
LocalDateTime months = now.plusMonths(1);
LocalDateTime years = now.plusYears(1);
//2018-12-05T10:01:51.024
System.out.println(dates);
//2018-12-11T10:01:51.024
System.out.println(weeks);
//2019-01-04T10:01:51.024
System.out.println(months);
//2019-12-04T10:01:51.024
System.out.println(years);
}
}
13.Java中,如何获取一年后的今天的零点的时间?
这个有很多种方式。在Java8之前,逐一设置Calendar的时分秒等。MILLISECOND也要设置哦。
在Java8之后,可以使用LocalDateTime。
也可以使用jodaTime的工具类,如 道 的回答。
还有一种方式。DateUtils提供的truncate(java.util.Calendar, int)方法,具体用法球友们可以自己尝试一下。
public class Get0ByCalendar {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.YEAR,1);
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
//Wed Dec 04 00:00:00 CST 2019
System.out.println(calendar.getTime());
}
}
public class Get0ByDateUtils {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.YEAR,1);
Date date = DateUtils.truncate(cal.getTime(), Calendar.DATE);
//Wed Dec 04 00:00:00 CST 2019
System.out.println(date);
}
}
14.在Java中,如何获取不同时区的当前时间
主要有2种方法
public class TimeZone {
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取美国洛杉矶时区的日期时间
simpleDateFormat.setTimeZone(java.util.TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println(simpleDateFormat.format(Calendar.getInstance().getTime()));
//获取美国洛杉矶时区的日期时间
java.util.TimeZone.setDefault(java.util.TimeZone.getTimeZone("America/Los_Angeles"));
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
}
}
2018-12-02 17:53:03
Sun Dec 02 17:53:03 PST 2018
15.在Java中,如何比较2个时间的大小
最常见的可以用Date自带的compareTo方法进行比较,大于,等于,小于分别返回1,0,-1(注意避免空指针)
public class CompareTime {
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String xx="1996-08-28 08:09:57";
String fc="1995-10-03 08:10:47";
try {
Date date1 = simpleDateFormat.parse(xx);
Date date2 = simpleDateFormat.parse(fc);
//1.使用Date的compareTo方法,大于,等于,小于分别返回1,0,-1
int i = date1.compareTo(date2);
System.out.println(i);
//2.使用时间戳,直接比较大小
long time1 = date1.getTime();
long time2 = date2.getTime();
System.out.println(time1>time2);
//3.使用Date的after(),before()方法
//前者比后者小返回true,前者比后者大返回false
System.out.println(date1.before(date2));
System.out.println(date1.after(date2));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
1
true
false
true
16.java.util.Date和java.sql.Date之间的区别和关系,如何互相转化?
java.sql.Date继承自 java.util.Date。
java.util.Date 类型写到数据库后存储的值可以到秒,java.sql.Date 类型的写入后只能到日期。
public class Date {
public static void main(String[] args) {
//util.date转化为sql.date
java.util.Date uDate = new java.util.Date();
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
//当前日期:2018-12-02
System.out.println("当前日期:"+sDate);
java.sql.Date sqlDate = new java.sql.Date(1111111111);
java.util.Date date = new java.util.Date(sqlDate.getTime());
//当前日期时间:Wed Jan 14 04:38:31 CST 1970
System.out.println("当前日期时间:"+date);
}
}
当前日期:2018-12-02
当前日期时间:Wed Jan 14 04:38:31 CST 1970
17.什么是GregorianCalendar
GregorianCalendar是一个计算函数,是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。是一种混合日历,可由调用者通过调用
18.Calendar.DAY_OF_YEAR、Calendar.DAY_OF_MONTH、Calendar.DATE有何区别?
Calendar cal1=Calendar.getInstance();
cal1.add(Calendar.DAY_OF_MONTH,1);
cal1.add(Calendar.DAY_OF_YEAR,1);
cal1.add(Calendar.DATE,1);
在add方法里操作是一样的,都是日期加1,在get方法里就不一样了
Calendar.DAY_OF_YEAR、Calendar.DAY_OF_MONTH、Calendar.DATE 主要是与Calendar的get方法结合使用的。分别返回:
- DAY_OF_YEAR : 该日期是这一年的第多少天。
- DAY_OF_MONTH:该日期是这个月第多少天。
- DATE:日期,包含年月日。
public class CalendarTest {
public static void main(String[] args) {
Calendar cal1=Calendar.getInstance();
//cal1.add(Calendar.DAY_OF_MONTH,1);
//cal1.add(Calendar.DAY_OF_YEAR,1);
//cal1.add(Calendar.DATE,1);
int day = cal1.get(Calendar.DATE);
int month = cal1.get(Calendar.MONTH)+1;
int year = cal1.get(Calendar.YEAR);
int dow = cal1.get(Calendar.DAY_OF_WEEK);
int dom = cal1.get(Calendar.DAY_OF_MONTH);
int doy = cal1.get(Calendar.DAY_OF_YEAR);
//当前时间:Sun Dec 02 11:00:58 CST 2018
System.out.println("当前时间:"+cal1.getTime());
//日期:2 今天是12/2号
System.out.println("日期:"+day);
//月份:12 今天是12/2号
System.out.println("月份:"+month);
//年份:2018
System.out.println("年份:"+year);
//一周的第几天:1 星期日为一周的第一天输出为 1
System.out.println("一周的第几天:"+dow);
//一月中的第几天:2 今天是12/2号
System.out.println("一月中的第几天:"+dom);
//一年中的第几天:336
System.out.println("一年中的第几天:"+doy);
}
}
当前时间:Sun Dec 02 11:05:37 CST 2018
日期:2
月份:12
年份:2018
一周的第几天:1
一月中的第几天:2
一年中的第几天:336
19.在Java8中,新的时间及日期API位于java.time包中,该包中有哪些重要的类。分别代表了什么?
- Instant:时间戳
- Duration:持续时间,时间差
- LocalDate:只包含日期,比如2018-12-02
- LocalTime:只包含时间,比如10:25:56
- LocalDateTime:包含日期和时间,比如2018-12-02 10:26:37
- Period:时间段
- ZoneOffset:时区偏移量,比如+8:00
- ZonedDateTime:带时区的时间,比如2018-12-02T10:29:49.465+08:00[Asia/Shanghai]
- Clock:时钟,比如获取美国纽约的时间
20.Java8 LocalTime和LocalDate的区别
public class LocalTime {
public static void main(String[] args) {
LocalDate date= LocalDate.now();
LocalDate of = LocalDate.of(2018, 12, 31);
java.time.LocalTime now = java.time.LocalTime.now();
java.time.LocalTime of1 = java.time.LocalTime.of(10, 30, 57);
//获取当前日期:2018-12-02
System.out.println("获取当前日期:"+date);
//构造指定日期:2018-12-31
System.out.println("构造指定日期:"+of);
//获取当前时间:
System.out.println("当前时间:"+now);
//构造指定时间:10:30:57
System.out.println("构造指定时间:"+of1);
}
}
21.Java8获取当前时间
public class LocalDate {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
//获取当前日期时间:当前时间:2018-12-02T09:51:31.749
System.out.println("获取当前日期时间:"+now);
//获取当前日期时间的年份:2018
System.out.println("获取当前日期时间的年份:"+now.getYear());
//构造一个指定日期时间的对象:2016-10-23T08:20
LocalDateTime dateTime = LocalDateTime.of(2016, 10, 23, 8, 20);
System.out.println("构造一个指定日期时间的对象:" + dateTime);
}
}