java8中时间获取

文章总结自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类库等


image

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);
        
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,160评论 1 44
  • 参考Java日期时间使用总结Java Calendar,Date,DateFormat,TimeZone,Loca...
    合肥黑阅读 3,944评论 1 6
  • 自从JDK 1.0开始,Java就提供了Date来处理时间和日期,作为老古董自然有很多东西是过时的。然后出现了Ca...
    湫水长天阅读 2,081评论 0 16
  • SwiftDate概况 从Swift发布起,我们就没有放弃使用Swift。 当然,我们希望在项目能够轻松自如地管理...
    Mee_Leo阅读 10,029评论 1 13
  • 来到这个我以后可能要待一辈子的小城,开始慢慢走过每条街道,品尝当地的特色小吃,突然幸福感爆棚,这个城市有我喜欢的工...
    小爬吖阅读 135评论 0 0