java⾃定义⽇期_java⾥怎么⾃定义⼀个⽇期!
展开全部
在旧版本的jdk中,Java的⽇期e68a8462616964757a686964616f31333337393532/时间类的定义并不⼀致,在java.util和java.sql的包中都有⽇期类,此外⽤于格式化和解析的类在SimpleDateFormat包中定义。
java.util.Date是在除了SQL语句的情况下⾯使⽤的。
java.sql.Date是针对SQL语句使⽤的,它只包含⽇期⽽没有时间部分
它们都有getTime⽅法返回毫秒数,⾃然就可以直接构建。 java.util.Date 是 java.sql.Date 的⽗类,前者是常⽤的表⽰时间的类,我们通常格式化或者得到当前时间都是⽤他,后者之后在读写数据库的时候⽤他,因为PreparedStament的setDate()的第2参数和ResultSet的getDate()⽅法的第2个参数都是java.sql.Date。
java.sql.Date转为java.util.Date
java.sql.Date date=new java.sql.Date();
java.util.Date d=new java.util.Date (Time());
java.util.Date转为java.sql.Date
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Time());
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Time());
java.sql.Time sTime=new java.sql.Time());
java.sql.Timestamp stp=new java.sql.Time());
这⾥所有时间⽇期都可以被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.Time());
另类取得年⽉⽇的⽅法:
SimpleDateFormat;
import java.util.*;
java.util.Date date = new java.util.Date();
//如果希望得到YYYYMMDD的格式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是开发⼈员最受追捧的变化之⼀,Java从⼀开始就没有对⽇期时间处理的⼀致性⽅法,因此⽇期/时间API也是除Java核⼼API以外另⼀项倍受欢迎的内容。
为什么我们需要新的Java⽇期/时间API?
在开始研究Java 8⽇期/时间API之前,让我们先来看⼀下为什么我们需要这样⼀个新的API。在Java中,现有的与⽇期和时间相关的类存在诸多问题,其中有:
1. Java的⽇期/时间类的定义并不⼀致,在java.util和java.sql的包中都有⽇期类,此外⽤于格式化和解析的类在包中定义。
2. java.util.Date同时包含⽇期和时间,⽽java.sql.Date仅包含⽇期,将其纳⼊java.sql包并不合理。另外这两个类都有相同的名字,这本⾝就是⼀个⾮常糟糕的设计。
3. 对于时间、时间戳、格式化以及解析,并没有⼀些明确定义的类。对于格式化和解析的需求,我们有DateFormat抽象类,但通常情况下,SimpleDateFormat类被⽤于此类需求。
4. 所有的⽇期类都是可变的,因此他们都不是线程安全的,这是Java⽇期类最⼤的问题之⼀。
5. ⽇期类并不提供国际化,没有时区⽀持,因此Java引⼊了java.util.Calendar java.util.TimeZone类,但他们同样存在上述所有的问题。
在现有的⽇期和⽇历类中定义的⽅法还存在⼀些其他的问题,但以上问题已经很清晰地表明:Java需要⼀个健壮的⽇期/时间类。这也是为什么Joda Time在Java⽇期/时间需求中扮演了⾼质量替换的重要⾓⾊。
Java 8⽇期/时间API是JSR-310的实现,它的实现⽬标是克服旧的⽇期时间实现中所有的缺陷,新的⽇期/时间API的⼀些设计原则是:
1. 不变性:新的⽇期/时间API中,所有的类都是不可变的,这对多线程环境有好处。
2. 关注点分离:新的API将⼈可读的⽇期时间和机器时间(unix timestamp)明确分离,它为⽇期(Date)、时间(Time)、⽇期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。
3. 清晰:在所有的类中,⽅法都被明确定义⽤以完成相同的⾏为。举个例⼦,要拿到当前实例我们可以使⽤now()⽅法,在所有的类中都定义了format()和parse()⽅法,⽽不是像以前那样专门有⼀个独⽴的类。为了更好的处理问题,所有的类都使⽤了⼯⼚模式和策略模式,⼀旦你使⽤了其中某个类的⽅法,与其他类协同⼯作并不困难。
4. 实⽤操作:所有新的⽇期/时间API类都实现了⼀系列⽅法⽤以完成通⽤的任务,如:加、减、格式化、解析、从⽇期/时间中提取单独部分,等等。
5. 可扩展性:新的⽇期/时间API是⼯作在ISO-8601⽇历系统上的,但我们也可以将其应⽤在⾮IOS的⽇历上。
Java⽇期/时间API包含以下相应的包。
1. java.time包:这是新的Java⽇期/时间API的基础包,所有的主要基础类都是这个包的⼀部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有这些类都是不可变的和线程安全的,在绝⼤多数情况下,这些类能够有效地处理⼀些公共的需求。
jdk怎么使用2. java.time.chrono包:这个包为⾮ISO的⽇历系统定义了⼀些泛化的API,我们可以扩展AbstractChronology类来创建⾃⼰的⽇历系统。
3. java.time.format包:这个包包含能够格式化和解析⽇期时间对象的类,在绝⼤多数情况下,我们不应该直接使⽤它们,因为java.time 包中相应的类已经提供了格式化和解析的⽅法。
4. poral包:这个包包含⼀些时态对象,我们可以⽤其出关于⽇期/时间对象的某个特定⽇期或时间,⽐如说,可以到某⽉的第⼀天或最后⼀天。你可以⾮常容易地认出这些⽅法,因为它们都具有“withXXX”的格式。
5. 包:这个包包含⽀持不同时区以及相关规则的类。
新旧API的对⽐图:
新API的⽰例代码:public class TimeIntroduction {
public static void testClock() throws InterruptedException {
//时钟提供给我们⽤于访问某个特定 时区的 瞬时时间、⽇期 和 时间的。
Clock c1 = Clock.systemUTC(); //系统默认UTC时钟(当前瞬时时间 System.currentTimeMillis())
System.out.println(c1.millis()); //每次调⽤将返回当前瞬时时间(UTC)
Clock c2 = Clock.systemDefaultZone(); //系统默认时区时钟(当前瞬时时间)
Clock c31 = Clock.system(ZoneId.of("Europe/Paris")); //巴黎时区
System.out.println(c31.millis()); //每次调⽤将返回当前瞬时时间(UTC)
Clock c32 = Clock.system(ZoneId.of("Asia/Shanghai"));//上海时区
System.out.println(c32.millis());//每次调⽤将返回当前瞬时时间(UTC)
Clock c4 = Clock.w(), ZoneId.of("Asia/Shanghai"));//固定上海时区时钟
System.out.println(c4.millis());
Thread.sleep(1000);
System.out.println(c4.millis()); //不变 即时钟时钟在那⼀个点不动
Clock c5 = Clock.offset(c1, Duration.ofSeconds(2)); //相对于系统默认时钟两秒的时钟
System.out.println(c1.millis());
System.out.println(c5.millis());
}
public static void testInstant() {
//瞬时时间 相当于以前的System.currentTimeMillis()
Instant instant1 = w();
System.out.EpochSecond());//精确到秒 得到相对于1970-01-01 00:00:00 UTC的⼀个时间
System.out.EpochMilli()); //精确到毫秒
Clock clock1 = Clock.systemUTC(); //获取系统UTC默认时钟
Instant instant2 = w(clock1);//得到时钟的瞬时时间
System.out.EpochMilli());
Clock clock2 = Clock.fixed(instant1, ZoneId.systemDefault()); //固定瞬时时间时钟
Instant instant3 = w(clock2);//得到时钟的瞬时时间
System.out.EpochMilli());//equals instant1
}
public static void testLocalDateTime() {
//使⽤默认时区时钟瞬时时间创建 Clock.systemDefaultZone() -->即相对于 ZoneId.systemDefault()默认时区LocalDateTime now = w();
System.out.println(now);
//⾃定义时区
LocalDateTime now2 = w(ZoneId.of("Europe/Paris"));
System.out.println(now2);//会以相应的时区显⽰⽇期
//⾃定义时钟
Clock clock = Clock.system(ZoneId.of("Asia/Dhaka"));
LocalDateTime now3 = w(clock);
System.out.println(now3);//会以相应的时区显⽰⽇期
//不需要写什么相对时间 如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);
//使⽤瞬时时间 + 时区
Instant instant = w();
LocalDateTime d3 = LocalDateTime.w(), 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.Year());
System.out.Month());
System.out.DayOfYear());
System.out.DayOfMonth());
System.out.DayOfWeek());
System.out.Hour());
System.out.Minute());
System.out.Second());
System.out.Nano());
//时间增减
LocalDateTime d7 = d6.minusDays(1);
LocalDateTime d8 = d7.plus(1, IsoFields.QUARTER_YEARS);
//LocalDate 即年⽉⽇ ⽆时分秒
//LocalTime即时分秒 ⽆年⽉⽇
//API和LocalDateTime类似就不演⽰了
}
public static void testZonedDateTime() {
//即带有时区的date-time 存储纳秒、时区和时差(避免与本地date-time歧义)。
//API和LocalDateTime类似,只是多了时差(如2013-12-20T10:35:50.711+08:00[Asia/Shanghai]) ZonedDateTime now = w();
System.out.println(now);
ZonedDateTime now2 = w(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), w()); //得到相应的时差
System.out.Days());
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论