十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
在舊版本的jdk中,Java的日期/時(shí)間類(lèi)的定義并不一致,在java.util和java.sql的包中都有日期類(lèi),此外用于格式化和解析的類(lèi)在java.text.SimpleDateFormat包中定義。
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到平定網(wǎng)站設(shè)計(jì)與平定網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋平定地區(qū)。
java.util.Date是在除了SQL語(yǔ)句的情況下面使用的。
java.sql.Date是針對(duì)SQL語(yǔ)句使用的,它只包含日期而沒(méi)有時(shí)間部分
它們都有g(shù)etTime方法返回毫秒數(shù),自然就可以直接構(gòu)建。?java.util.Date 是 java.sql.Date 的父類(lèi),前者是常用的表示時(shí)間的類(lèi),我們通常格式化或者得到當(dāng)前時(shí)間都是用他,后者之后在讀寫(xiě)數(shù)據(jù)庫(kù)的時(shí)候用他,因?yàn)镻reparedStament的setDate()的第2參數(shù)和ResultSet的getDate()方法的第2個(gè)參數(shù)都是java.sql.Date。
java.sql.Date轉(zhuǎn)為java.util.Date
java.sql.Date date=new java.sql.Date();
java.util.Date d=new java.util.Date (date.getTime());
java.util.Date轉(zhuǎn)為java.sql.Date
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
java.sql.Time sTime=new java.sql.Time(utilDate.getTime());
java.sql.Timestamp stp=new java.sql.Timestamp(utilDate.getTime());
這里所有時(shí)間日期都可以被SimpleDateFormat格式化format()
SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
f.format(stp);
f.format(sTime);
f.format(sqlDate);
f.format(utilDate)
java.sql.Date sqlDate=java.sql.Date.valueOf(" 2005-12-12");
utilDate=new java.util.Date(sqlDate.getTime());
另類(lèi)取得年月日的方法:
import java.text.SimpleDateFormat;
import java.util.*;
java.util.Date date = new java.util.Date();
//如果希望得到Y(jié)YYYMMDD的格式SimpleDateFormat
sy1=new SimpleDateFormat("yyyyMMDD");
String dateFormat=sy1.format(date);
//如果希望分開(kāi)得到年,月,日SimpleDateFormat
sy=new SimpleDateFormat("yyyy");
SimpleDateFormat sm=new SimpleDateFormat("MM");
SimpleDateFormat sd=new SimpleDateFormat("dd");
String syear=sy.format(date);
String smon=sm.format(date);
String sday=sd.format(date);
注意啦!!!在JAVA 8中有了日期的新的表示方式。在java.time包中。
Java 8日期/時(shí)間( Date/Time)API是開(kāi)發(fā)人員最受追捧的變化之一,Java從一開(kāi)始就沒(méi)有對(duì)日期時(shí)間處理的一致性方法,因此日期/時(shí)間API也是除Java核心API以外另一項(xiàng)倍受歡迎的內(nèi)容。
為什么我們需要新的Java日期/時(shí)間API?
在開(kāi)始研究Java 8日期/時(shí)間API之前,讓我們先來(lái)看一下為什么我們需要這樣一個(gè)新的API。在Java中,現(xiàn)有的與日期和時(shí)間相關(guān)的類(lèi)存在諸多問(wèn)題,其中有:
1. Java的日期/時(shí)間類(lèi)的定義并不一致,在java.util和java.sql的包中都有日期類(lèi),此外用于格式化和解析的類(lèi)在java.text包中定義。
2. java.util.Date同時(shí)包含日期和時(shí)間,而java.sql.Date僅包含日期,將其納入java.sql包并不合理。另外這兩個(gè)類(lèi)都有相同的名字,這本身就是一個(gè)非常糟糕的設(shè)計(jì)。
3. 對(duì)于時(shí)間、時(shí)間戳、格式化以及解析,并沒(méi)有一些明確定義的類(lèi)。對(duì)于格式化和解析的需求,我們有java.text.DateFormat抽象類(lèi),但通常情況下,SimpleDateFormat類(lèi)被用于此類(lèi)需求。
4. 所有的日期類(lèi)都是可變的,因此他們都不是線程安全的,這是Java日期類(lèi)最大的問(wèn)題之一。
5. 日期類(lèi)并不提供國(guó)際化,沒(méi)有時(shí)區(qū)支持,因此Java引入了java.util.Calendar java.util.TimeZone類(lèi),但他們同樣存在上述所有的問(wèn)題。
?在現(xiàn)有的日期和日歷類(lèi)中定義的方法還存在一些其他的問(wèn)題,但以上問(wèn)題已經(jīng)很清晰地表明:Java需要一個(gè)健壯的日期/時(shí)間類(lèi)。這也是為什么Joda Time在Java日期/時(shí)間需求中扮演了高質(zhì)量替換的重要角色。
Java 8日期/時(shí)間API是JSR-310的實(shí)現(xiàn),它的實(shí)現(xiàn)目標(biāo)是克服舊的日期時(shí)間實(shí)現(xiàn)中所有的缺陷,新的日期/時(shí)間API的一些設(shè)計(jì)原則是:
1. 不變性:新的日期/時(shí)間API中,所有的類(lèi)都是不可變的,這對(duì)多線程環(huán)境有好處。
2. 關(guān)注點(diǎn)分離:新的API將人可讀的日期時(shí)間和機(jī)器時(shí)間(unix timestamp)明確分離,它為日期(Date)、時(shí)間(Time)、日期時(shí)間(DateTime)、時(shí)間戳(unix timestamp)以及時(shí)區(qū)定義了不同的類(lèi)。
3. 清晰:在所有的類(lèi)中,方法都被明確定義用以完成相同的行為。舉個(gè)例子,要拿到當(dāng)前實(shí)例我們可以使用now()方法,在所有的類(lèi)中都定義了format()和parse()方法,而不是像以前那樣專(zhuān)門(mén)有一個(gè)獨(dú)立的類(lèi)。為了更好的處理問(wèn)題,所有的類(lèi)都使用了工廠模式和策略模式,一旦你使用了其中某個(gè)類(lèi)的方法,與其他類(lèi)協(xié)同工作并不困難。
4. 實(shí)用操作:所有新的日期/時(shí)間API類(lèi)都實(shí)現(xiàn)了一系列方法用以完成通用的任務(wù),如:加、減、格式化、解析、從日期/時(shí)間中提取單獨(dú)部分,等等。
5. 可擴(kuò)展性:新的日期/時(shí)間API是工作在ISO-8601日歷系統(tǒng)上的,但我們也可以將其應(yīng)用在非IOS的日歷上。
Java日期/時(shí)間API包含以下相應(yīng)的包。
1. java.time包:這是新的Java日期/時(shí)間API的基礎(chǔ)包,所有的主要基礎(chǔ)類(lèi)都是這個(gè)包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有這些類(lèi)都是不可變的和線程安全的,在絕大多數(shù)情況下,這些類(lèi)能夠有效地處理一些公共的需求。
2. java.time.chrono包:這個(gè)包為非ISO的日歷系統(tǒng)定義了一些泛化的API,我們可以擴(kuò)展AbstractChronology類(lèi)來(lái)創(chuàng)建自己的日歷系統(tǒng)。
3. java.time.format包:這個(gè)包包含能夠格式化和解析日期時(shí)間對(duì)象的類(lèi),在絕大多數(shù)情況下,我們不應(yīng)該直接使用它們,因?yàn)閖ava.time包中相應(yīng)的類(lèi)已經(jīng)提供了格式化和解析的方法。
4. java.time.temporal包:這個(gè)包包含一些時(shí)態(tài)對(duì)象,我們可以用其找出關(guān)于日期/時(shí)間對(duì)象的某個(gè)特定日期或時(shí)間,比如說(shuō),可以找到某月的第一天或最后一天。你可以非常容易地認(rèn)出這些方法,因?yàn)樗鼈兌季哂小皐ithXXX”的格式。
5. java.time.zone包:這個(gè)包包含支持不同時(shí)區(qū)以及相關(guān)規(guī)則的類(lèi)。
新舊API的對(duì)比圖:
新API的示例代碼:
public?class?TimeIntroduction?{
public?static?void?testClock()?throws?InterruptedException?{
//時(shí)鐘提供給我們用于訪問(wèn)某個(gè)特定?時(shí)區(qū)的?瞬時(shí)時(shí)間、日期?和?時(shí)間的。??
Clock?c1?=?Clock.systemUTC();?//系統(tǒng)默認(rèn)UTC時(shí)鐘(當(dāng)前瞬時(shí)時(shí)間?System.currentTimeMillis())??
System.out.println(c1.millis());?//每次調(diào)用將返回當(dāng)前瞬時(shí)時(shí)間(UTC)??
Clock?c2?=?Clock.systemDefaultZone();?//系統(tǒng)默認(rèn)時(shí)區(qū)時(shí)鐘(當(dāng)前瞬時(shí)時(shí)間)??
Clock?c31?=?Clock.system(ZoneId.of("Europe/Paris"));?//巴黎時(shí)區(qū)??
System.out.println(c31.millis());?//每次調(diào)用將返回當(dāng)前瞬時(shí)時(shí)間(UTC)??
Clock?c32?=?Clock.system(ZoneId.of("Asia/Shanghai"));//上海時(shí)區(qū)??
System.out.println(c32.millis());//每次調(diào)用將返回當(dāng)前瞬時(shí)時(shí)間(UTC)??
Clock?c4?=?Clock.fixed(Instant.now(),?ZoneId.of("Asia/Shanghai"));//固定上海時(shí)區(qū)時(shí)鐘??
System.out.println(c4.millis());
Thread.sleep(1000);
System.out.println(c4.millis());?//不變?即時(shí)鐘時(shí)鐘在那一個(gè)點(diǎn)不動(dòng)??
Clock?c5?=?Clock.offset(c1,?Duration.ofSeconds(2));?//相對(duì)于系統(tǒng)默認(rèn)時(shí)鐘兩秒的時(shí)鐘??
System.out.println(c1.millis());
System.out.println(c5.millis());
}
public?static?void?testInstant()?{
//瞬時(shí)時(shí)間?相當(dāng)于以前的System.currentTimeMillis()??
Instant?instant1?=?Instant.now();
System.out.println(instant1.getEpochSecond());//精確到秒?得到相對(duì)于1970-01-01?00:00:00?UTC的一個(gè)時(shí)間??
System.out.println(instant1.toEpochMilli());?//精確到毫秒??
Clock?clock1?=?Clock.systemUTC();?//獲取系統(tǒng)UTC默認(rèn)時(shí)鐘??
Instant?instant2?=?Instant.now(clock1);//得到時(shí)鐘的瞬時(shí)時(shí)間??
System.out.println(instant2.toEpochMilli());
Clock?clock2?=?Clock.fixed(instant1,?ZoneId.systemDefault());?//固定瞬時(shí)時(shí)間時(shí)鐘??
Instant?instant3?=?Instant.now(clock2);//得到時(shí)鐘的瞬時(shí)時(shí)間??
System.out.println(instant3.toEpochMilli());//equals?instant1??
}
public?static?void?testLocalDateTime()?{
//使用默認(rèn)時(shí)區(qū)時(shí)鐘瞬時(shí)時(shí)間創(chuàng)建?Clock.systemDefaultZone()?--即相對(duì)于?ZoneId.systemDefault()默認(rèn)時(shí)區(qū)??
LocalDateTime?now?=?LocalDateTime.now();
System.out.println(now);
//自定義時(shí)區(qū)??
LocalDateTime?now2?=?LocalDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println(now2);//會(huì)以相應(yīng)的時(shí)區(qū)顯示日期??
//自定義時(shí)鐘??
Clock?clock?=?Clock.system(ZoneId.of("Asia/Dhaka"));
LocalDateTime?now3?=?LocalDateTime.now(clock);
System.out.println(now3);//會(huì)以相應(yīng)的時(shí)區(qū)顯示日期??
//不需要寫(xiě)什么相對(duì)時(shí)間?如java.util.Date?年是相對(duì)于1900?月是從0開(kāi)始??
//2013-12-31?23:59??
LocalDateTime?d1?=?LocalDateTime.of(2013,?12,?31,?23,?59);
//年月日?時(shí)分秒?納秒??
LocalDateTime?d2?=?LocalDateTime.of(2013,?12,?31,?23,?59,?59,?11);
//使用瞬時(shí)時(shí)間?+?時(shí)區(qū)??
Instant?instant?=?Instant.now();
LocalDateTime?d3?=?LocalDateTime.ofInstant(Instant.now(),?ZoneId.systemDefault());
System.out.println(d3);
//解析String---LocalDateTime??
LocalDateTime?d4?=?LocalDateTime.parse("2013-12-31T23:59");
System.out.println(d4);
LocalDateTime?d5?=?LocalDateTime.parse("2013-12-31T23:59:59.999");//999毫秒?等價(jià)于999000000納秒??
System.out.println(d5);
//使用DateTimeFormatter?API?解析?和?格式化??
DateTimeFormatter?formatter?=?DateTimeFormatter.ofPattern("yyyy/MM/dd?HH:mm:ss");
LocalDateTime?d6?=?LocalDateTime.parse("2013/12/31?23:59:59",?formatter);
System.out.println(formatter.format(d6));
//時(shí)間獲取??
System.out.println(d6.getYear());
System.out.println(d6.getMonth());
System.out.println(d6.getDayOfYear());
System.out.println(d6.getDayOfMonth());
System.out.println(d6.getDayOfWeek());
System.out.println(d6.getHour());
System.out.println(d6.getMinute());
System.out.println(d6.getSecond());
System.out.println(d6.getNano());
//時(shí)間增減??
LocalDateTime?d7?=?d6.minusDays(1);
LocalDateTime?d8?=?d7.plus(1,?IsoFields.QUARTER_YEARS);
//LocalDate?即年月日?無(wú)時(shí)分秒??
//LocalTime即時(shí)分秒?無(wú)年月日??
//API和LocalDateTime類(lèi)似就不演示了??
}
public?static?void?testZonedDateTime()?{
//即帶有時(shí)區(qū)的date-time?存儲(chǔ)納秒、時(shí)區(qū)和時(shí)差(避免與本地date-time歧義)。??
//API和LocalDateTime類(lèi)似,只是多了時(shí)差(如2013-12-20T10:35:50.711+08:00[Asia/Shanghai])??
ZonedDateTime?now?=?ZonedDateTime.now();
System.out.println(now);
ZonedDateTime?now2?=?ZonedDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println(now2);
//其他的用法也是類(lèi)似的?就不介紹了??
ZonedDateTime?z1?=?ZonedDateTime.parse("2013-12-31T23:59:59Z[Europe/Paris]");
System.out.println(z1);
}
public?static?void?testDuration()?{
//表示兩個(gè)瞬時(shí)時(shí)間的時(shí)間段??
Duration?d1?=?Duration.between(Instant.ofEpochMilli(System.currentTimeMillis()?-?12323123),?Instant.now());
//得到相應(yīng)的時(shí)差??
System.out.println(d1.toDays());
System.out.println(d1.toHours());
System.out.println(d1.toMinutes());
System.out.println(d1.toMillis());
System.out.println(d1.toNanos());
//1天時(shí)差?類(lèi)似的還有如ofHours()??
Duration?d2?=?Duration.ofDays(1);
System.out.println(d2.toDays());
}
public?static?void?testChronology()?{
//提供對(duì)java.util.Calendar的替換,提供對(duì)年歷系統(tǒng)的支持??
Chronology?c?=?HijrahChronology.INSTANCE;
ChronoLocalDateTime?d?=?c.localDateTime(LocalDateTime.now());
System.out.println(d);
}
/**
*?新舊日期轉(zhuǎn)換
*/
public?static?void?testNewOldDateConversion(){
Instant?instant=new?Date().toInstant();
Date?date=Date.from(instant);
System.out.println(instant);
System.out.println(date);
}
public?static?void?main(String[]?args)?throws?InterruptedException?{
testClock();
testInstant();
testLocalDateTime();
testZonedDateTime();
testDuration();
testChronology();
testNewOldDateConversion();
}
}
可以直接通過(guò)jdk基本方法,獲取到當(dāng)前的時(shí)間
Date date= new Date();//創(chuàng)建一個(gè)時(shí)間對(duì)象,獲取到當(dāng)前的時(shí)間
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設(shè)置時(shí)間顯示格式
String str = sdf.format(date);//將當(dāng)前時(shí)間格式化為需要的類(lèi)型
System.out.println(str);//輸出結(jié)果
結(jié)果為:2015-11-06 13:53:54(實(shí)時(shí))。
int m1 = c.get(Calendar.MONTH);
設(shè)置的地方,和取出來(lái)的地方,都沒(méi)有考慮+1,所以結(jié)果還是7。
class MyDate{
public int year,month,day;
public MyDate(MyDate date){
year=date.year;
month=date.month;
day=date.day;
}
public boolean isLeapYear(){
return (((year%4==0)(year%100!=0))||(year%400==0));
}
public MyDate(int y,int m,int d){
year=y;
month=m;
day=d;
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))((day1)||(day31))) System.out.println("wrong date");
if(((month==4)||(month==6)||(month==9)||(month==11))((day1)||(day30))) System.out.println("wrong date");
if(month==2){
if(isLeapYear()((day1)||(day29))) System.out.println("wrong date");
if(!isLeapYear()((day1)||(day28))) System.out.println("wrong date");
}
}
public boolean equal(MyDate date){
return (year==date.year month==date.month day==date.day);
}
public void incrementDay(){
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)){
int flag=0;
if(day==31){month+=1;flag=1;}
if((day=30)(day=1)){day+=1;}
if(flag==1) day=1;
flag=0;
}
if((month==4)||(month==6)||(month==9)||(month==11)){
int flag=0;
if(day==30){month+=1;flag=1;}
if((day=29)(day=1)){day+=1;}
if(flag==1) day=1;
flag=0;
}
if(month==12){
int flag=0;
if(day==31){year+=1;month=1;flag=1;}
if((day=1)(day=30)){day+=1;}
if(flag==1) day=1;
flag=0;
}
if(month==2){
int flag=0;
if(isLeapYear()){
if(day==29){month+=1;flag=1;}
if((day=28)(day=1)){day+=1;}
if(flag==1) day=1;
flag=0;
}
else{
if(day==28){month+=1;flag=1;}
if((day=27)(day=1)){day+=1;}
if(flag==1) day=1;
flag=0;
}
}
}
public int getYear(){
return year;
}
public int getMonth(){
return month;
}
public int getDay(){
return day;
}
public String toString(){
return (year+"-"+month+"-"+day);
}
}
public class Mytest{
public static void main(String[] test){
MyDate date1=new MyDate(2000,2,28);
MyDate date2=new MyDate(2006,12,31);
MyDate date3=new MyDate(date2);
System.out.println(date3.equal(date2));
date1.incrementDay();
System.out.println(date1.getYear()+" "+date1.getMonth()+" "+date1.getDay());
System.out.println(date1.toString());
date2.incrementDay();
System.out.println(date2.getYear()+" "+date2.getMonth()+" "+date2.getDay());
System.out.println(date2.toString());
}
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 設(shè)置指定日期
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, 4);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date date = new Date(cal.getTimeInMillis());
// 格式化
String dateStr = dateFormat.format(date);
// 打印
System.out.println(dateStr);
望采納!