什么是时区?北京时间和美国洛杉矶时间差多少个小时,北京时间和美国纽约时间差几个小时?
解:
时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。这些偏差就是所谓的时差。
为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。这样使用起来就很方便。现今全球共分为24个时区。由于实用上常常1个国家,或1个省份同时跨着2个或更多时区,为了照顾到行政上的方便,常将1个国家或1个省份划在一起。所以时区并不严格按南北直线来划分,而是按自然条件来划分。例如,中国幅员宽广,差不多跨5个时区,但为了使用方便简单,实际上在只用东八时区的标准时即北京时间为准。
北京时间比洛杉矶时间早15或者16个小时。具体和时令有关。
北京时间比纽约时间早12或者13个小时。具体和时令有关。
什么是格林威治时间?
解:
格林尼治平时(英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线。
自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。
格林尼治平时的正午是指当平太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。
一般使用GMT+8表示中国的时间,是因为中国位于东八区,时间上比格林威治时间快8个小时。
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
什么是时间戳?
解:
时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
为什么在有些系统出现问题的时候,时间会显示成: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。
Java中Timestamp和Date之间如何相互转换。
解:
// java.util.Date转换为java.sql.Timestamp
Date date = new Date();
new Timestamp(date.getTime());
// java.sql.Timestamp转换为java.util.Date
Timestamp ts = new Timestamp(System.currentTimeMillis());
Date date = new Date(ts.getTime());
Java 8之前,Java中如何获取系统的当前时间。
解:
1、
Date date = new Date();
2、
Calendar c1=Calendar.getInstance();
c1.getTime();
什么是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的对象,然后再设定该对象中的年月日参数来完成。
Calendar如何获取当前时间
解:
Calendar ca=Calendar.getInstance();
Date d =(Date) ca.getTime();
如何在Date和String之间相互转换
解:
最简单的方式就是使用SimpleDateFormat。SimpleDateFormat是Java提供的一个格式化和解析日期的工具类。
// Date转String
Date data = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dataStr = sdf.format(data);
System.out.println(dataStr);
// String转Data
System.out.println(sdf.parse(dataStr));
SimpleDateFormat是线程安全的吗?使用时应该注意什么?
解:
SimpleDateFormat是非线程安全的,所以在多线程场景中,不能使用SimpleDateFormat作为共享变量。
http://3a97dfb8.wiz03.com/share/s/0WBZ-U0cfkax2O1aCs039sgh3vt4ID33bkqA2ak63P3NmCIZ
Java中,如何获取一年(一个月、一周、一天)后的时间?
解:
在Java 8之前,使用Calendar 来获取。
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 增加一天
// calendar.add(Calendar.DATE,1);
// 增加一周
// calendar.add(Calendar.WEEK_OF_YEAR, 1);
// 增加一个月
// calendar.add(Calendar.MONTH, 1);
// 增加一年
// calendar.add(Calendar.YEAR, 1);
date = calendar.getTime();
在Java 8之后,可以使用LocalDateTime,
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
LocalDateTime oneDayLater = now.plusDays(1L);
LocalDateTime oneWeekLater = now.plusWeeks(1L);
LocalDateTime oneMonthLater = now.plusMonths(1L);
LocalDateTime oneYearLater = now.plusYears(1L);
Java中,如何获取一年后的今天的零点的时间?
解:
这个有很多种方式。在Java8之前,可以逐一设置Calendar的时分秒等。MILLISECOND也要设置哦。
package com.xdwang.test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test2 {
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);
System.out.println(dateToString(calendar.getTime()));
}
public static String dateToString(Date date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(date);
}
}
在Java8之后,可以使用LocalDateTime。
LocalDateTime now = LocalDateTime.now();
LocalDateTime oneYearLater = now.plusYears(1L);
System.out.println(LocalDateTime.of(oneYearLater.toLocalDate(), LocalTime.MIN));
也可以使用jodaTime的工具类。
DateTime time = new DateTime().plusYear(1).withMillisOfDay(0)
还有一种方式。DateUtils提供的truncate(java.util.Calendar, int)方法,具体用法球友们可以自己尝试一下。
org.apache.commons.lang3.time.DateUtils
public class Test21 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.YEAR, 1);
Date date = DateUtils.truncate(calendar.getTime(), Calendar.DATE);
System.out.println(dateToString(date));
}
public static String dateToString(Date date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(date);
}
}
在Java中,如何获取不同时区的当前时间。
解:
主要以下两种方法:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); System.out.println(sdf.format(Calendar.getInstance().getTime()));
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
在Java中,如何比较两个时间的大小?
解:
最常见的可以用Date自带的compareTo方法进行比较,大于、等于、小于分别返回1、0、-1。(注意,避免空指针。)
public class Test23 {
public static void main(String args[]) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
String time1 = "1990-01-07 08-08-08";
String time2 = "2018-11-19 08-08-08";
Date date1 = simpleDateFormat.parse(time1);
Date date2 = simpleDateFormat.parse(time2);
// 1.使用Date的compareTo()方法,大于、等于、小于分别返回1、0、-1
System.out.println(date1.compareTo(date2));
// 2.使用时间戳(指的是从1970年1月1日起到该日期的毫秒数)直接比较大小
System.out.println(date1.getTime() > date2.getTime());
// 3.使用Date的before()、after()方法
// 如果前者比后者小返回true,否则为false
System.out.println(date1.before(date2));
// 如果前者比后者大返回true,否则为false
System.out.println(date1.after(date2));
}
}
本质还是根据时间戳进行比较。
java.util.Date和java.sql.Date之间的区别和关系,如何互相转化?
解:
java.sql.Date继承自 java.util.Date。
java.util.Date 类型写到数据库后存储的值可以到秒,java.sql.Date 类型的写入后只能到日期。
二者之间的转化比较简单,直接通过构造函数即可:
java.util.Date utilDate = new java.util.Date();
new java.sql.Date(utilDate.getTime());
java.sql.Date sqlDate = new java.sql.Date();
new java.util.Date(sqlDate.getTime());
什么是GregorianCalendar?
解:
GregorianCalendar是一个计算函数,是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。是一种混合日历,可由调用者通过调用 setGregorianChange() 来更改起始日期。
可以使用以下两种方法创建一个GregorianCalendar。
Calendar c=new GregorianCalendar();
//直接创建 Calendar c=Calendar.getInstance();
//工厂方法 月份从零开始,0表示一月,11表示12月。
c.set(Calendar.MONTH, 1);
//2月,0为1月 星期从1开始,1表示周一,7表示周日。
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);
结果为何一样?
答:
Calendar.DAY_OF_YEAR、Calendar.DAY_OF_MONTH、Calendar.DATE 主要是与Calendar的get方法结合使用的。分别返回:
DAY_OF_YEAR : 该日期是这一年的第多少天。
DAY_OF_MONTH:该日期是这个月第多少天。
DATE:日期,包含年月日。
Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DATE);
int month = cal.get(Calendar.MONTH) + 1;
int year = cal.get(Calendar.YEAR);
int dow = cal.get(Calendar.DAY_OF_WEEK);
int dom = cal.get(Calendar.DAY_OF_MONTH);
int doy = cal.get(Calendar.DAY_OF_YEAR);
System.out.println("当期时间: " + cal.getTime()); System.out.println("日期: " + day);
System.out.println("月份: " + month);
System.out.println("年份: " + year);
System.out.println("一周的第几天: " + dow); // 星期日为一周的第一天输出为 1,星期一
System.out.println("一月中的第几天: " + dom);
System.out.println("一年的第几天: " + doy); }
在Java8中,新的时间及日期API位于java.time包中,该包中有哪些重要的类。分别代表了什么?
解:
Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2016-10-20
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间
在Java8中,LocalTime 和 LocalDate有啥区别?
解:LocalDate表示日期,年月日,LocalTime表示时间,时分秒
在Java8中,如何获取当前时间?
解:
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d t %n", year, month, day);
在Java8中如何创建一个任意指定日期?
LocalDate date = LocalDate.of(2018, 01, 01);
如何在Java 8中检查闰年?
直接使用LocalDate的isLeapYear即可判断是否闰年 LocalDate nowDate = LocalDate.now(); //判断闰年 boolean leapYear = nowDate.isLeapYear();
在Java8中计算两个日期之间的天数和月数
在Java 8中可以用java.time.Period类来做计算。
Period period = Period.between(
LocalDate.of(2018, 1, 5),
LocalDate.of(2018, 2, 5)
);