1、Calendar概述
Java官方推荐使用Calendar来替换Date的使用,Calendar与Date之间可以自由的进行转换,转换的纽带是time,使用Calendar的getTime()方法可以得到一个Date类型的对象,这个对象底层是使用Date的第二个带Long型参数的构造器创建的,这个Long型参数是Calendar中的time字段中保存的值,这个time字段的值是在具体的实现类中定义赋值的比如GregorianCalendar中的实现computeTime(),这个方法的目的就是将field值转换为time值,这个涉及到Calendar中的两种模式,之后会有介绍;而通过Calendar的setTime(Date date)方法可以将一个Date对象转换为一个Calendar对象,这个方法以一个Date对象为参数,底层调用的setTimeInMillis(long millis)方法,将date.getTime()的值作为参数,再底层会将这个Long型参数值赋值给time字段,这时会重计算field值。
Calendar与Date的转换
1 public static void main(String[] args) { 2 //Calendar--->Date 3 Calendar c = Calendar.getInstance(); 4 Date d = c.getTime(); 5 //Date--->Calendar 6 Date d1 = new Date(); 7 Calendar c1 = Calendar.getInstance(); 8 c1.setTime(d1); 9 10 System.out.println(d);11 System.out.println(c1.get(Calendar.YEAR)+"年"+(c1.get(Calendar.MONTH)+1)+"月"+c1.get(Calendar.DATE)+"日");12 }
结果:
Sat Jul 08 10:39:14 CST 20172017年7月8日
2、Calendar中的time与field
Calendar中有两种描述时间内容的域,一种就是time,它用来保存Calendar对象所代表的时间点据1970年1月1日 00:00:00的毫秒数,另一种就是field,它是一个数组,它表示的并不是一个内容,而是Calendar内部定义的最多静态常量字段。
而这一般情况下是同步的,即表述的是同一时间点,但也有可能会出现不同步的情况:
a、起初,field没有设置,time也是无效的
b、如果time被设置,所有的field都会自动被设置为同步的时间点
c、如果某一field被单独设置,time会自动失效
更确切的说,当我们通过Calendar.getInstance()方法获取一个全新的Calendar对象时,它所代表的时间点是通过time来设置的,而这个time的值是通过System.currentTimeMillis()得到的,通过time定义Calendar,isTimeSet为true,表示time值是最新的(真的),areFieldsSet为false,表示field字段的值都是旧的(假的),因为当我们重新设置了time值之后,Calendar所代表的时间点就发生了变化(这里是首次,相当于从无到有,也算是变化,之后当我们为Calendar的time重新设置一个新值时,Calendar的时间点就会再次发生变化,它会指向最新的time值所代表的时间点),而这时field中还表示的是原来的时间点内容,然后会调用computeFields()方法进行所有字段值的重计算,确保field中的值与time同步,并同时将areFieldsSet和areAllFieldsSet设置为true,表示所有的field代表的时间值也是最新的了(真)。其实我们每次更改time值都会自动触发重计算,来确保两个域所描述的时间点一致(即同步),这也就是上面b所述的内容。
但是如果我们通过set(int field, int value)单独对field中的某行一字段进行更改时,首先会触发一个验证,areFieldsSet为真而areAllFieldsSet为false时,表示只有一部分field是最新的情况,即存在部分field属于旧的情况,针对这种情况会触发field的重新计算;之后会将isTimeSet设置为false,areFieldsSet设置为false,将isSet[field]设置为true(将当前field设置为真),这种情况下,当我们使用getTime()获取time值所代表的时间点时,由于isTimeSet为false,会触发time的重计算,这个计算依据是根据field的值进行的,之后将isTimeSet设置为true,同样我们在通过get(int field)获取某个field值时也会先验证isTimeSet是否为true,如果为false,同样会触发time的重计算,然后验证areFieldsSet为false,则触发其余field的重计算。
time的重计算是依据field的,确切的说是依据部分field的,而有一部分field也是在field的基础上再计算的,所以可以说有一部分field是固定的,是和time息息相关的,
以上种种所述全部是Calendar内部的实现规则,对外而言,我们只需要简单的调用即可,所有这些都被隐藏在内部,从而保证我们通过对外方法获取到的直接就是正确的值。
1 public static void main(String[] args) throws ParseException { 2 System.out.println("-------初始情况-------"); 3 Calendar c = Calendar.getInstance(); 4 System.out.println(c.getTime()); 5 System.out.println(c.get(Calendar.DATE)); 6 System.out.println(c.get(Calendar.HOUR)); 7 System.out.println("-------重设置time-------"); 8 c.setTime(new SimpleDateFormat("yyyyMMdd").parse("20170501")); 9 System.out.println(c.getTime());10 System.out.println(c.get(Calendar.DATE));11 System.out.println(c.get(Calendar.HOUR));12 System.out.println("-------重设置field-------");13 c.set(Calendar.MONTH, 4);14 System.out.println(c.getTime());15 System.out.println(c.get(Calendar.DATE));16 System.out.println(c.get(Calendar.HOUR));17 System.out.println("总结:time与field所代表时间点同步,所有的不同步全部在内部处理完成");18 }
结果:
-------初始情况-------Sat Jul 08 13:08:34 CST 2017 8 1 -------重设置time-------Mon May 01 00:00:00 CST 2017 1 0 -------重设置field-------Mon May 01 00:00:00 CST 2017 1 0总结:time与field所代表时间点同步,所有的不同步全部在内部处理完成
3、Calendar中的两种解析模式
lenient:该模式下可以自动规则化用户赋值给Calendar的不规则值,比如1月32日会被解析为2月1日
non-lenient:该模式下不会自动解析不规则的输入,而是一旦发现不规则输入,就会报出异常
这也叫Calendar的容错性,lenient的开启与关闭使用setLenient(boolean lenient)方法来设置,true表示开启容错性(默认情况),false表示关闭该功能。
1 public static void main(String[] args) { 2 Calendar c = Calendar.getInstance(); 3 c.set(Calendar.MONTH, 8); 4 c.set(Calendar.DAY_OF_MONTH, 33); 5 System.out.println(c.getTime()+"\n"); 6 c.setLenient(false); 7 c.set(Calendar.MONTH, 8); 8 c.set(Calendar.DAY_OF_MONTH, 33); 9 System.out.println(c.getTime());10 }
结果:
Tue Oct 03 13:18:48 CST 2017Exception in thread "main" java.lang.IllegalArgumentException: DAY_OF_MONTH at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2583) at java.util.Calendar.updateTime(Calendar.java:2606) at java.util.Calendar.getTimeInMillis(Calendar.java:1118) at java.util.Calendar.getTime(Calendar.java:1091) at JdkTest.main(JdkTest.java:87)
从上面的例子中可以看出,默认情况下,我们为Calendar的月份赋值为8即九月份,日期赋值为33即下一月3号,输出为10月3日,容错性将这种不符合规则的输入规则化处理了,而关闭容错性之后,同样的赋值只会报异常java.lang.IllegalArgumentException(非法参数异常)。
4、Calendar的使用
1 public static void main(String[] args) throws ParseException { 2 //通过SimpleDateFormat解析日期字符串 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss.SSS"); 4 Date date = sdf.parse("20170502 13:33:23.433"); 5 //将Date格式日期转换成Calendar 6 Calendar c = Calendar.getInstance(); 7 c.setTime(date); 8 //获取时间值 9 System.out.println(c.getTime());10 System.out.println("年份为"+c.get(Calendar.YEAR));11 System.out.println("月份为"+c.get(Calendar.MONTH));12 System.out.println("日期为"+c.get(Calendar.DATE));13 System.out.println("日期为"+c.get(Calendar.DAY_OF_MONTH));14 System.out.println("日期为"+c.get(Calendar.DAY_OF_WEEK));15 System.out.println("日期为"+c.get(Calendar.DAY_OF_WEEK_IN_MONTH));16 System.out.println("日期为"+c.get(Calendar.DAY_OF_YEAR));17 System.out.println("时为"+c.get(Calendar.HOUR));18 System.out.println("时为"+c.get(Calendar.HOUR_OF_DAY));19 System.out.println("分为"+c.get(Calendar.MINUTE));20 System.out.println("秒为"+c.get(Calendar.SECOND));21 System.out.println("毫秒为"+c.get(Calendar.MILLISECOND));22 System.out.println("星期为"+c.get(Calendar.WEEK_OF_MONTH));23 System.out.println("星期为"+c.get(Calendar.WEEK_OF_YEAR));24 System.out.println("历型为"+c.get(Calendar.ERA));25 System.out.println("zone为"+c.get(Calendar.ZONE_OFFSET));26 //设置27 c.set(Calendar.MONTH, Calendar.APRIL);28 System.out.println("修改后月份为"+c.get(Calendar.MONTH));29 c.set(1999, 0, 23);30 System.out.println(c.getTime());31 c.set(2000, 1, 12, 13, 33, 14);32 System.out.println(c.getTime());33 c.set(2001, 2, 13, 14, 13);34 System.out.println(c.getTime());35 //运算36 System.out.println("-----运算-----");37 c.add(Calendar.YEAR, 12);38 System.out.println(c.getTime());39 c.add(Calendar.MONTH, -1);40 System.out.println(c.getTime());41 c.roll(Calendar.DATE, true);42 System.out.println(c.getTime());43 c.add(Calendar.DATE, 1);44 System.out.println(c.getTime());45 //roll与add运算对比46 c.set(2000, 1, 29);47 System.out.println(c.getTime());48 c.roll(Calendar.DATE, 1);49 System.out.println(c.getTime());50 c.set(2000, 1, 29);51 c.add(Calendar.DATE, 1);52 System.out.println(c.getTime());53 }
结果:
Tue May 02 13:33:23 CST 2017年份为2017 月份为4 日期为2 日期为2 日期为3 日期为1 日期为122 时为1 时为13 分为33 秒为23 毫秒为433 星期为1 星期为18 历型为1 zone为28800000 修改后月份为3 Sat Jan 23 13:33:23 CST 1999Sat Feb 12 13:33:14 CST 2000Tue Mar 13 14:13:14 CST 2001 -----运算-----Wed Mar 13 14:13:14 CST 2013Wed Feb 13 14:13:14 CST 2013Thu Feb 14 14:13:14 CST 2013Fri Feb 15 14:13:14 CST 2013Tue Feb 29 14:13:14 CST 2000Tue Feb 01 14:13:14 CST 2000Wed Mar 01 14:13:14 CST 2000
对比上面最后的两行输出,可以看出add与roll的运算规则其实是不同的,roll的运算不会影响大规则(这里的大规则指的是月份的改变)的改变,而add会影响。
Atas ialah kandungan terperinci 对Calendar的概述. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel ini membincangkan menggunakan Maven dan Gradle untuk Pengurusan Projek Java, membina automasi, dan resolusi pergantungan, membandingkan pendekatan dan strategi pengoptimuman mereka.

Artikel ini membincangkan membuat dan menggunakan perpustakaan Java tersuai (fail balang) dengan pengurusan versi dan pergantungan yang betul, menggunakan alat seperti Maven dan Gradle.

Artikel ini membincangkan pelaksanaan caching pelbagai peringkat di Java menggunakan kafein dan cache jambu untuk meningkatkan prestasi aplikasi. Ia meliputi persediaan, integrasi, dan faedah prestasi, bersama -sama dengan Pengurusan Dasar Konfigurasi dan Pengusiran PRA Terbaik

Artikel ini membincangkan menggunakan JPA untuk pemetaan objek-relasi dengan ciri-ciri canggih seperti caching dan pemuatan malas. Ia meliputi persediaan, pemetaan entiti, dan amalan terbaik untuk mengoptimumkan prestasi sambil menonjolkan potensi perangkap. [159 aksara]

Kelas kelas Java melibatkan pemuatan, menghubungkan, dan memulakan kelas menggunakan sistem hierarki dengan bootstrap, lanjutan, dan pemuat kelas aplikasi. Model delegasi induk memastikan kelas teras dimuatkan dahulu, yang mempengaruhi LOA kelas tersuai


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.