文章總結(jié)自Hollis的知識星球告希,直面Java版塊姑曙,公眾號Hollis模叙,轉(zhuǎn)侵刪
1.什么是時區(qū)严里,北京時間和洛杉磯時間差多少個小時新啼,北京時間和美國紐約時間差多少個小時
時區(qū)是地球上的區(qū)域使用同一個時間定義。以前田炭,人們通過觀察太陽的位置(時角)決定時間师抄,這就使得不同經(jīng)度的地方的時間有所不同(地方時)。1863年教硫,首次使用時區(qū)的概念叨吮。時區(qū)通過設(shè)立一個區(qū)域的標(biāo)準(zhǔn)時間部分地解決了這個問題辆布。
世界各個國家位于地球不同位置上,因此不同國家茶鉴,特別是東西跨度大的國家日出锋玲、日落時間必定有所偏差。這些偏差就是所謂的時差涵叮。
為了照顧到各地區(qū)的使用方便惭蹂,又使其他地方的人容易將本地的時間換算到別的地方時間上去。有關(guān)國際會議決定將地球表面按經(jīng)線從東到西割粮,劃成一個個區(qū)域盾碗,并且規(guī)定相鄰區(qū)域的時間相差1小時。在同一區(qū)域內(nèi)的東端和西端的人看到太陽升起的時間最多相差不過1小時舀瓢。當(dāng)人們跨過一個區(qū)域廷雅,就將自己的時鐘校正1小時(向西減1小時,向東加1小時)京髓,跨過幾個區(qū)域就加或減幾小時航缀。這樣使用起來就很方便。現(xiàn)今全球共分為24個時區(qū)堰怨。由于實用上常常1個國家芥玉,或1個省份同時跨著2個或更多時區(qū),為了照顧到行政上的方便备图,常將1個國家或1個省份劃在一起灿巧。所以時區(qū)并不嚴(yán)格按南北直線來劃分,而是按自然條件來劃分揽涮。例如砸烦,中國幅員寬廣,差不多跨5個時區(qū)绞吁,但為了使用方便簡單幢痘,實際上在只用東八時區(qū)的標(biāo)準(zhǔn)時即北京時間為準(zhǔn)。
北京時間比洛杉磯時間早15或者16個小時家破。具體和時令有關(guān)颜说。
北京時間比紐約時間早12或者13個小時。具體和時令有關(guān)汰聋。
2.什么是冬令時门粪?什么是夏令時?
冬令時北京時間和美國洛杉磯時間差多少個小時烹困?
夏令時北京時間和美國洛杉磯時間差多少個小時玄妈?
冬令時北京時間和美國紐約時間差幾個小時?
夏令時北京時間和美國洛杉磯時間差多少個小時?
3.什么是格林威治時間拟蜻?
格林尼治平時(英語:Greenwich Mean Time绎签,GMT)是指位于英國倫敦郊區(qū)的皇家格林尼治天文臺當(dāng)?shù)氐钠教枙r,因為本初子午線被定義為通過那里的經(jīng)線酝锅。
自1924年2月5日開始诡必,格林尼治天文臺負(fù)責(zé)每隔一小時向全世界發(fā)放調(diào)時信息。
格林尼治平時的正午是指當(dāng)平太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間搔扁。由于地球每天的自轉(zhuǎn)是有些不規(guī)則的爸舒,而且正在緩慢減速,因此格林尼治平時基于天文觀測本身的缺陷稿蹲,已經(jīng)被原子鐘報時的協(xié)調(diào)世界時(UTC)所取代扭勉。
一般使用GMT+8表示中國的時間,是因為中國位于東八區(qū)苛聘,時間上比格林威治時間快8個小時剖效。
4.CET,UTC,GMT,CST幾種常見時間的含義和關(guān)系?
CET :歐洲中部時間(英語:Central European Time焰盗,CET)是比世界標(biāo)準(zhǔn)時間(UTC)早一個小時的時區(qū)名稱之一。它被大部分歐洲國家和部分北非國家采用咒林。冬季時間為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 :協(xié)調(diào)世界時垫竞,又稱世界標(biāo)準(zhǔn)時間或世界協(xié)調(diào)時間澎粟,簡稱UTC,從英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而來欢瞪。臺灣采用CNS 7648的《資料元及交換格式–資訊交換–日期及時間的表示法》(與ISO 8601類似)稱之為世界統(tǒng)一時間活烙。中國大陸采用ISO 8601-1988的國標(biāo)《數(shù)據(jù)元和交換格式信息交換日期和時間表示法》(GB/T 7408)中稱之為國際協(xié)調(diào)時間。協(xié)調(diào)世界時是以原子時秒長為基礎(chǔ)遣鼓,在時刻上盡量接近于世界時的一種時間計量系統(tǒng)啸盏。
參考資料http://zh.wikipedia.org/zhhans/%E4%B8%96%E7%95%8C%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4
GMT: 格林尼治標(biāo)準(zhǔn)時間(舊譯格林尼治平均時間或格林威治標(biāo)準(zhǔn)時間;英語:Greenwich Mean Time骑祟,GMT)是指位于英國倫敦郊區(qū)的皇家格林尼治天文臺的標(biāo)準(zhǔn)時間回懦,因為本初子午線被定義在通過那里的經(jīng)線。 參考資料:http://zh.wikipedia.org/wiki/GMT CST 北京時間次企,China Standard Time怯晕,又名中國標(biāo)準(zhǔn)時間,是中國的標(biāo)準(zhǔn)時間缸棵。在時區(qū)劃分上舟茶,屬東八區(qū),比協(xié)調(diào)世界時早8小時,記為UTC+8吧凉,與中華民國國家標(biāo)準(zhǔn)時間(舊稱“中原標(biāo)準(zhǔn)時間”)隧出、香港時間和澳門時間和相同。當(dāng)格林威治時間為凌晨0:00時客燕,中國標(biāo)準(zhǔn)時間剛好為上午8:00鸳劳。
參考資料:http://zh.wikipedia.org/zh/CSThttp://zh.wikipedia.org/wiki/%E5%8C%97%E4%BA%AC%E6%97%B6%E9%97%B4
關(guān)系 :
CET=UTC/GMT + 1小時
CST=UTC/GMT +8 小時
CST=CET+9
5.什么是時間戳?
時間戳(timestamp)也搓,一個能表示一份數(shù)據(jù)在某個特定時間之前已經(jīng)存在的赏廓、 完整的、 可驗證的數(shù)據(jù),通常是一個字符序列傍妒,唯一地標(biāo)識某一刻的時間幔摸。
時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現(xiàn)在的總秒數(shù)。通俗的講颤练, 時間戳是一份能夠表示一份數(shù)據(jù)在一個特定時間點已經(jīng)存在的完整的可驗證的數(shù)據(jù)既忆。
6.為什么在有些系統(tǒng)出現(xiàn)問題的時候,時間會顯示成:Thu Jan 01 08:00:00 CST 1970 或者 1970-01-01 08:00:00
當(dāng)有些計算機存儲或者傳輸 Timestamp 出錯時嗦玖,這個 Timestamp 就會取默認(rèn)值患雇。而在計算機中,默認(rèn)值通常是 0宇挫。
當(dāng) Timestamp 為 0苛吱,就表示時間(GMT)1970年1月1日0時0分0秒。中國使用北京時間器瘪,處于東 8 區(qū)翠储,相應(yīng)就是早上 8 點。因此在中國這邊橡疼,時間出錯了援所,就經(jīng)常會顯示成 1970年1月1日 08:00。
7.Java中Timestamp和Date之間如何相互轉(zhuǎn)換欣除。
public class Date2Timestamp {
public static void main(String[] args) {
//1.java.util.Date轉(zhuǎn)化為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轉(zhuǎn)換為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轉(zhuǎn)化為java.sql.Timestamp
Mon Dec 03 19:28:11 CST 2018
1543836491253
2018-12-03 19:28:11.253
//2.java.sql.Timestamp轉(zhuǎn)換為java.util.Date
1543836491270
Mon Dec 03 19:28:11 CST 2018
8.Java 8之前住拭,Java中如何獲取系統(tǒng)的當(dāng)前時間。
1历帚、
Date date = new Date();
2废酷、
Calendar c1=Calendar.getInstance();
c1.getTime();
9.什么是Calendar
從JDK1.1版本開始抹缕,在處理日期和時間時澈蟆,系統(tǒng)推薦使用Calendar類進行實現(xiàn)。在設(shè)計上卓研,Calendar類的功能要比Date類強大很多趴俘,而且在實現(xiàn)方式上也比Date類要復(fù)雜一些睹簇。 Calendar類是一個抽象類,在實際使用時實現(xiàn)特定的子類的對象寥闪,創(chuàng)建對象的過程對程序員來說是透明的太惠,只需要使用getInstance方法創(chuàng)建即可。
1疲憋、使用Calendar類代表當(dāng)前時間
Calendar c = Calendar.getInstance();
由于Calendar類是抽象類凿渊,且Calendar類的構(gòu)造方法是protected的缚柳,所以無法使用Calendar類的構(gòu)造方法來創(chuàng)建對象彩掐,API中提供了getInstance方法用來創(chuàng)建對象。 使用該方法獲得的Calendar對象就代表當(dāng)前的系統(tǒng)時間灰追,由于Calendar類toString實現(xiàn)的沒有Date類那么直觀堵幽,所以直接輸出Calendar類的對象意義不大。
2弹澎、使用Calendar類代表指定的時間
Calendar c1 = Calendar.getInstance();
c1.set(2018, 11 , 11);
使用Calendar類代表特定的時間朴下,需要首先創(chuàng)建一個Calendar的對象,然后再設(shè)定該對象中的年月日參數(shù)來完成苦蒿。
10.Calendar如何獲取當(dāng)前時間
Calendar ca=Calendar.getInstance();
Date d =(Date) ca.getTime();
11.如何在Date和String之間相互轉(zhuǎn)換
最簡單的方式就是使用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是線程安全的嗎免胃?使用時應(yīng)該注意什么音五?
SimpleDateFormat是非線程安全的,所以在多線程場景中扼雏,不能使用SimpleDateFormat作為共享變量坚嗜。
解決方法大概有以下幾類:
1.各線程間不共享SimpleDateFormat,在使用到的時候再創(chuàng)建(可能會大量的創(chuàng)建銷毀對象)
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 結(jié)果是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之前侮东,逐一設(shè)置Calendar的時分秒等圈盔。MILLISECOND也要設(shè)置哦。
在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中围辙,如何獲取不同時區(qū)的當(dāng)前時間
主要有2種方法
public class TimeZone {
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//獲取美國洛杉磯時區(qū)的日期時間
simpleDateFormat.setTimeZone(java.util.TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println(simpleDateFormat.format(Calendar.getInstance().getTime()));
//獲取美國洛杉磯時區(qū)的日期時間
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之間的區(qū)別和關(guān)系押赊,如何互相轉(zhuǎn)化饺藤?
java.sql.Date繼承自 java.util.Date。
java.util.Date 類型寫到數(shù)據(jù)庫后存儲的值可以到秒流礁,java.sql.Date 類型的寫入后只能到日期涕俗。
public class Date {
public static void main(String[] args) {
//util.date轉(zhuǎn)化為sql.date
java.util.Date uDate = new java.util.Date();
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
//當(dāng)前日期:2018-12-02
System.out.println("當(dāng)前日期:"+sDate);
java.sql.Date sqlDate = new java.sql.Date(1111111111);
java.util.Date date = new java.util.Date(sqlDate.getTime());
//當(dāng)前日期時間:Wed Jan 14 04:38:31 CST 1970
System.out.println("當(dāng)前日期時間:"+date);
}
}
當(dāng)前日期:2018-12-02
當(dāng)前日期時間:Wed Jan 14 04:38:31 CST 1970
17.什么是GregorianCalendar
GregorianCalendar是一個計算函數(shù),是 Calendar 的一個具體子類神帅,提供了世界上大多數(shù)國家/地區(qū)使用的標(biāo)準(zhǔn)日歷系統(tǒng)再姑。是一種混合日歷,可由調(diào)用者通過調(diào)用
18.Calendar.DAY_OF_YEAR找御、Calendar.DAY_OF_MONTH询刹、Calendar.DATE有何區(qū)別谜嫉?
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方法結(jié)合使用的蔽挠。分別返回:
- 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);
//當(dāng)前時間:Sun Dec 02 11:00:58 CST 2018
System.out.println("當(dāng)前時間:"+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);
}
}
當(dāng)前時間:Sun Dec 02 11:05:37 CST 2018
日期:2
月份:12
年份:2018
一周的第幾天:1
一月中的第幾天:2
一年中的第幾天:336
19.在Java8中,新的時間及日期API位于java.time包中杠巡,該包中有哪些重要的類量窘。分別代表了什么?
- Instant:時間戳
- Duration:持續(xù)時間氢拥,時間差
- LocalDate:只包含日期,比如2018-12-02
- LocalTime:只包含時間蚌铜,比如10:25:56
- LocalDateTime:包含日期和時間,比如2018-12-02 10:26:37
- Period:時間段
- ZoneOffset:時區(qū)偏移量嫩海,比如+8:00
- ZonedDateTime:帶時區(qū)的時間冬殃,比如2018-12-02T10:29:49.465+08:00[Asia/Shanghai]
- Clock:時鐘,比如獲取美國紐約的時間
20.Java8 LocalTime和LocalDate的區(qū)別
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);
//獲取當(dāng)前日期:2018-12-02
System.out.println("獲取當(dāng)前日期:"+date);
//構(gòu)造指定日期:2018-12-31
System.out.println("構(gòu)造指定日期:"+of);
//獲取當(dāng)前時間:
System.out.println("當(dāng)前時間:"+now);
//構(gòu)造指定時間:10:30:57
System.out.println("構(gòu)造指定時間:"+of1);
}
}
21.Java8獲取當(dāng)前時間
public class LocalDate {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
//獲取當(dāng)前日期時間:當(dāng)前時間:2018-12-02T09:51:31.749
System.out.println("獲取當(dāng)前日期時間:"+now);
//獲取當(dāng)前日期時間的年份:2018
System.out.println("獲取當(dāng)前日期時間的年份:"+now.getYear());
//構(gòu)造一個指定日期時間的對象:2016-10-23T08:20
LocalDateTime dateTime = LocalDateTime.of(2016, 10, 23, 8, 20);
System.out.println("構(gòu)造一個指定日期時間的對象:" + dateTime);
}
}