第一個問題:
創(chuàng)新互聯(lián)建站長期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為江海企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,江海網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
這有好幾種做法都可以實現(xiàn):
1.new一個java.util.Date對象,調(diào)用它的setYear、setMonth等等方法,設(shè)置你要的年月日。不過這種做法不推薦,因為setYear等方法已經(jīng)過時了。
2.new一個java.util.SimpleDateFormat類的實例,構(gòu)造方法可以指定日期格式,例如yyyy-MM-dd,其中yyyy表示四位年份,MM表示兩位月份,dd表示兩位日期。然后通過調(diào)用這個SimpleDateFormat實例的parse方法可以解析獲得指定日期的Date對象。
代碼示例:
SimpleDateFormat
sdf
=
new
SimpleDateFormat("yyyy-MM-dd");
Date
d
=
sdf.parse("2014-03-02");
3.通過java.util.Calendar類的靜態(tài)方法getInstance()獲得一個日歷類實例,然后調(diào)用此實例的set(int
year,
int
month,
int
date)
設(shè)置日歷字段
YEAR、MONTH
和
DAY_OF_MONTH
的值,然后調(diào)用實例的getTime()方法可以獲得指定日期的Date對象
第二個問題:
參考上一個問題的第3種做法,Calendar.getInstance()獲得的是當(dāng)前時刻的日歷實例對象,調(diào)用此實例對象的setLenient(false)設(shè)置日歷解釋為寬松模式,然后再通過roll(int
field,
boolean
up)方法在給定的時間字段上添加或減去(上/下)單個時間單元(例如你要的“一個月”時間單月),最后通過getTime()方法獲得Date對象。
這兩個問題都是很簡單的,你找份JDK
API文檔看看就可以找到辦法了,自己多看多想會更好。
public class TestDate {
/**
* 這個靜態(tài)變量是用來表示,在潤年的時候每個月的最大的天數(shù),下標(biāo)對應(yīng)月份
* 如果不是潤年的話,把DAYS[2]減1就可以了
*/
private static final int[] DAYS = {0,31,29,31,30,31,30,31,31,30,31,30,31};
/**
* 這個變量是用來貯存年的
*/
private int year;
/**
* 這個變量是用來貯存月的
*/
private int month;
/**
* 這個變量是用來貯存日的
*/
private int day;
/**
* 構(gòu)造方法
*/
public TestDate() {
super();
}
/**
* 年的get方法
*/
public int getYear() {
return this.year;
}
/**
* 年的set方法
*/
public void setYear(int year){
this.year = year;
}
/**
* 月的get方法
*/
public int getMonth() {
return this.month;
}
/**
* 月的set方法
*/
public void setMonth(int month){
this.month = month;
}
/**
* 日的get方法
*/
public int getDay() {
return this.day;
}
/**
* 日的set方法
*/
public void setDay(int day){
this.day = day;
}
//============================= 下面是具體的方法 ===========================
/**
* 你的目的代碼,設(shè)置日期
*/
public void set(int year,int month,int day){
boolean isLeepYear = this.isLeepYear(year);//判斷是不是潤年
this.year = year;//對成員變量賦值
this.month = ((month = 1) (month = 12)) ? month : 1;
int _tempDay = DAYS[this.month];//獲得這個月份的最大天數(shù)
if(!isLeepYear month == 2) _tempDay--;//如果不是潤年且是2月份,天數(shù)再減1
this.day = ((day = 1) (day = _tempDay)) ? day : 1; //判斷天數(shù)是否正確
}
/**
* 判斷是不是潤年,你的問題也在這兒,先寫一個方法
* 確定是不是潤年,以便能確定你的二月最多是多少天,其它的就沒有什么了,是固定的
*/
public boolean isLeepYear(int year){
//具體算法你自己找找吧,網(wǎng)上一大堆,這里就不解釋了
if((year % 400 == 0) || (year % 100 !=0 year % 4 == 0)) return true;
else return false;
}
//========================= 再給你加個方法方便輸出 ===========================
public String toString(){
return this.year + "-" + this.month + "-" + this.day;
}
public static void main(String[] args){
TestDate td = new TestDate();
//正確的
td.set(2000,2,29);
System.out.println(td);
td.set(1998,12,22);
System.out.println(td);
td.set(1997,4,18);
System.out.println(td);
//錯誤的
td.set(2000,2,33);
System.out.println(td);
td.set(1995,2,56);
System.out.println(td);
td.set(1996,15,80);
System.out.println(td);
}
}
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);
望采納!
在舊版本的jdk中,Java的日期/時間類的定義并不一致,在java.util和java.sql的包中都有日期類,此外用于格式化和解析的類在java.text.SimpleDateFormat包中定義。
java.util.Date是在除了SQL語句的情況下面使用的。
java.sql.Date是針對SQL語句使用的,它只包含日期而沒有時間部分
它們都有g(shù)etTime方法返回毫秒數(shù),自然就可以直接構(gòu)建。?java.util.Date 是 java.sql.Date 的父類,前者是常用的表示時間的類,我們通常格式化或者得到當(dāng)前時間都是用他,后者之后在讀寫數(shù)據(jù)庫的時候用他,因為PreparedStament的setDate()的第2參數(shù)和ResultSet的getDate()方法的第2個參數(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());
這里所有時間日期都可以被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());
另類取得年月日的方法:
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);
//如果希望分開得到年,月,日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日期/時間( Date/Time)API是開發(fā)人員最受追捧的變化之一,Java從一開始就沒有對日期時間處理的一致性方法,因此日期/時間API也是除Java核心API以外另一項倍受歡迎的內(nèi)容。
為什么我們需要新的Java日期/時間API?
在開始研究Java 8日期/時間API之前,讓我們先來看一下為什么我們需要這樣一個新的API。在Java中,現(xiàn)有的與日期和時間相關(guān)的類存在諸多問題,其中有:
1. Java的日期/時間類的定義并不一致,在java.util和java.sql的包中都有日期類,此外用于格式化和解析的類在java.text包中定義。
2. java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,將其納入java.sql包并不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設(shè)計。
3. 對于時間、時間戳、格式化以及解析,并沒有一些明確定義的類。對于格式化和解析的需求,我們有java.text.DateFormat抽象類,但通常情況下,SimpleDateFormat類被用于此類需求。
4. 所有的日期類都是可變的,因此他們都不是線程安全的,這是Java日期類最大的問題之一。
5. 日期類并不提供國際化,沒有時區(qū)支持,因此Java引入了java.util.Calendar java.util.TimeZone類,但他們同樣存在上述所有的問題。
?在現(xiàn)有的日期和日歷類中定義的方法還存在一些其他的問題,但以上問題已經(jīng)很清晰地表明:Java需要一個健壯的日期/時間類。這也是為什么Joda Time在Java日期/時間需求中扮演了高質(zhì)量替換的重要角色。
Java 8日期/時間API是JSR-310的實現(xiàn),它的實現(xiàn)目標(biāo)是克服舊的日期時間實現(xiàn)中所有的缺陷,新的日期/時間API的一些設(shè)計原則是:
1. 不變性:新的日期/時間API中,所有的類都是不可變的,這對多線程環(huán)境有好處。
2. 關(guān)注點分離:新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它為日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區(qū)定義了不同的類。
3. 清晰:在所有的類中,方法都被明確定義用以完成相同的行為。舉個例子,要拿到當(dāng)前實例我們可以使用now()方法,在所有的類中都定義了format()和parse()方法,而不是像以前那樣專門有一個獨立的類。為了更好的處理問題,所有的類都使用了工廠模式和策略模式,一旦你使用了其中某個類的方法,與其他類協(xié)同工作并不困難。
4. 實用操作:所有新的日期/時間API類都實現(xiàn)了一系列方法用以完成通用的任務(wù),如:加、減、格式化、解析、從日期/時間中提取單獨部分,等等。
5. 可擴展性:新的日期/時間API是工作在ISO-8601日歷系統(tǒng)上的,但我們也可以將其應(yīng)用在非IOS的日歷上。
Java日期/時間API包含以下相應(yīng)的包。
1. java.time包:這是新的Java日期/時間API的基礎(chǔ)包,所有的主要基礎(chǔ)類都是這個包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有這些類都是不可變的和線程安全的,在絕大多數(shù)情況下,這些類能夠有效地處理一些公共的需求。
2. java.time.chrono包:這個包為非ISO的日歷系統(tǒng)定義了一些泛化的API,我們可以擴展AbstractChronology類來創(chuàng)建自己的日歷系統(tǒng)。
3. java.time.format包:這個包包含能夠格式化和解析日期時間對象的類,在絕大多數(shù)情況下,我們不應(yīng)該直接使用它們,因為java.time包中相應(yīng)的類已經(jīng)提供了格式化和解析的方法。
4. java.time.temporal包:這個包包含一些時態(tài)對象,我們可以用其找出關(guān)于日期/時間對象的某個特定日期或時間,比如說,可以找到某月的第一天或最后一天。你可以非常容易地認(rèn)出這些方法,因為它們都具有“withXXX”的格式。
5. java.time.zone包:這個包包含支持不同時區(qū)以及相關(guān)規(guī)則的類。
新舊API的對比圖:
新API的示例代碼:
public?class?TimeIntroduction?{
public?static?void?testClock()?throws?InterruptedException?{
//時鐘提供給我們用于訪問某個特定?時區(qū)的?瞬時時間、日期?和?時間的。??
Clock?c1?=?Clock.systemUTC();?//系統(tǒng)默認(rèn)UTC時鐘(當(dāng)前瞬時時間?System.currentTimeMillis())??
System.out.println(c1.millis());?//每次調(diào)用將返回當(dāng)前瞬時時間(UTC)??
Clock?c2?=?Clock.systemDefaultZone();?//系統(tǒng)默認(rèn)時區(qū)時鐘(當(dāng)前瞬時時間)??
Clock?c31?=?Clock.system(ZoneId.of("Europe/Paris"));?//巴黎時區(qū)??
System.out.println(c31.millis());?//每次調(diào)用將返回當(dāng)前瞬時時間(UTC)??
Clock?c32?=?Clock.system(ZoneId.of("Asia/Shanghai"));//上海時區(qū)??
System.out.println(c32.millis());//每次調(diào)用將返回當(dāng)前瞬時時間(UTC)??
Clock?c4?=?Clock.fixed(Instant.now(),?ZoneId.of("Asia/Shanghai"));//固定上海時區(qū)時鐘??
System.out.println(c4.millis());
Thread.sleep(1000);
System.out.println(c4.millis());?//不變?即時鐘時鐘在那一個點不動??
Clock?c5?=?Clock.offset(c1,?Duration.ofSeconds(2));?//相對于系統(tǒng)默認(rèn)時鐘兩秒的時鐘??
System.out.println(c1.millis());
System.out.println(c5.millis());
}
public?static?void?testInstant()?{
//瞬時時間?相當(dāng)于以前的System.currentTimeMillis()??
Instant?instant1?=?Instant.now();
System.out.println(instant1.getEpochSecond());//精確到秒?得到相對于1970-01-01?00:00:00?UTC的一個時間??
System.out.println(instant1.toEpochMilli());?//精確到毫秒??
Clock?clock1?=?Clock.systemUTC();?//獲取系統(tǒng)UTC默認(rèn)時鐘??
Instant?instant2?=?Instant.now(clock1);//得到時鐘的瞬時時間??
System.out.println(instant2.toEpochMilli());
Clock?clock2?=?Clock.fixed(instant1,?ZoneId.systemDefault());?//固定瞬時時間時鐘??
Instant?instant3?=?Instant.now(clock2);//得到時鐘的瞬時時間??
System.out.println(instant3.toEpochMilli());//equals?instant1??
}
public?static?void?testLocalDateTime()?{
//使用默認(rèn)時區(qū)時鐘瞬時時間創(chuàng)建?Clock.systemDefaultZone()?--即相對于?ZoneId.systemDefault()默認(rèn)時區(qū)??
LocalDateTime?now?=?LocalDateTime.now();
System.out.println(now);
//自定義時區(qū)??
LocalDateTime?now2?=?LocalDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println(now2);//會以相應(yīng)的時區(qū)顯示日期??
//自定義時鐘??
Clock?clock?=?Clock.system(ZoneId.of("Asia/Dhaka"));
LocalDateTime?now3?=?LocalDateTime.now(clock);
System.out.println(now3);//會以相應(yīng)的時區(qū)顯示日期??
//不需要寫什么相對時間?如java.util.Date?年是相對于1900?月是從0開始??
//2013-12-31?23:59??
LocalDateTime?d1?=?LocalDateTime.of(2013,?12,?31,?23,?59);
//年月日?時分秒?納秒??
LocalDateTime?d2?=?LocalDateTime.of(2013,?12,?31,?23,?59,?59,?11);
//使用瞬時時間?+?時區(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毫秒?等價于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));
//時間獲取??
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());
//時間增減??
LocalDateTime?d7?=?d6.minusDays(1);
LocalDateTime?d8?=?d7.plus(1,?IsoFields.QUARTER_YEARS);
//LocalDate?即年月日?無時分秒??
//LocalTime即時分秒?無年月日??
//API和LocalDateTime類似就不演示了??
}
public?static?void?testZonedDateTime()?{
//即帶有時區(qū)的date-time?存儲納秒、時區(qū)和時差(避免與本地date-time歧義)。??
//API和LocalDateTime類似,只是多了時差(如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);
//其他的用法也是類似的?就不介紹了??
ZonedDateTime?z1?=?ZonedDateTime.parse("2013-12-31T23:59:59Z[Europe/Paris]");
System.out.println(z1);
}
public?static?void?testDuration()?{
//表示兩個瞬時時間的時間段??
Duration?d1?=?Duration.between(Instant.ofEpochMilli(System.currentTimeMillis()?-?12323123),?Instant.now());
//得到相應(yīng)的時差??
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天時差?類似的還有如ofHours()??
Duration?d2?=?Duration.ofDays(1);
System.out.println(d2.toDays());
}
public?static?void?testChronology()?{
//提供對java.util.Calendar的替換,提供對年歷系統(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();
}
}
Date
public Date(int year,
int month,
int day)
參數(shù):
year - year 減去 1900,它必須是 0 到 8099 之間的數(shù)。(注意,8099 是由 9999 減去 1900 得到的。)
month - 0 到 11 之間的數(shù)
day - 1 到 31 之間的數(shù)
測試代碼如下:
import java.util.Date;
public class Test {
public static void main(String args[]){
Date date = new Date(2010-1900,1,10);
System.out.println(date);
}
}
運行結(jié)果:
Wed Feb 10 00:00:00 CST 2010
希望對你有幫助。。。。。。仍有問題可以HI我。。。。
本文題目:Java設(shè)置日期的代碼 java設(shè)置date類型日期
網(wǎng)頁路徑:http://aaarwkj.com/article32/dooogpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、建站公司、商城網(wǎng)站、網(wǎng)站改版、ChatGPT、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)