Svi*_*ish 194 java date deprecated
我来自C#世界,所以对Java还没有太多经验.Eclipse刚刚告诉他们Date
已经弃用了.
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Run Code Online (Sandbox Code Playgroud)
为什么?应该使用什么(特别是在上面的情况下)呢?
Buf*_*alo 237
该java.util.Date
班实际上没有过时,只是构造,与其他几个构造函数/方法已过时一起.它被弃用了,因为这种用法不适用于国际化.该Calendar
级应使用:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1988);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date dateRepresentation = cal.getTime();
Run Code Online (Sandbox Code Playgroud)
看一下Javadoc的日期:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
Rub*_*ben 94
不推荐使用特定的Date构造函数,而应使用Calendar.JavaDoc for Date描述了不推荐使用的构造函数以及如何使用Calendar替换它们.
Bas*_*que 68
LocalDate.of( 1985 , 1 , 1 )
Run Code Online (Sandbox Code Playgroud)
…要么…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Run Code Online (Sandbox Code Playgroud)
的java.util.Date
,java.util.Calendar
和java.text.SimpleDateFormat
班级被送往太快时的Java首次推出和发展.这些课程没有很好地设计或实施.尝试了改进,因此您发现了弃用.不幸的是,改进的尝试基本上失败了 你应该完全避免这些类.它们在Java 8中被新类所取代.
java.util.Date同时具有日期和时间部分.您忽略了代码中的时间部分.因此,Date类将按照JVM的默认时区定义的一天开始,并将该时间应用于Date对象.因此,代码的结果将根据其运行的机器或设置的时区而有所不同.可能不是你想要的.
如果您只想要日期,没有时间部分,例如出生日期,您可能不想使用Date
对象.您可能只想以ISO 8601格式存储日期字符串YYYY-MM-DD
.或者使用LocalDate
Joda-Time中的对象(见下文).
首先要学习Java:避免使用与Java捆绑在一起的臭名昭着的java.util.Date和java.util.Calendar类.
正如user3277382在答案中正确指出的那样,在Java 8中使用Joda-Time或新的java.time.*包.
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Run Code Online (Sandbox Code Playgroud)
转储到控制台......
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Run Code Online (Sandbox Code Playgroud)
跑的时候......
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
Run Code Online (Sandbox Code Playgroud)
在这种情况下,java.time的代码几乎与Joda-Time的代码相同.
我们得到一个时区(ZoneId
),并构造一个分配给该时区(ZonedDateTime
)的日期时间对象.然后使用不可变对象模式,我们根据旧对象的同一时刻(自纪元以来的纳秒数)创建新的日期时间,但指定了其他时区.最后我们得到一个LocalDate
没有时间或时区但是在确定该日期时注意时区适用(例如,在奥斯陆的新日期比在纽约早些时候开始).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval
,YearWeek
,YearQuarter
,和更多.
Ste*_*n C 11
不推荐使用构造函数的一个原因是year参数的含义不是您所期望的.javadoc说:
从JDK 1.1版开始,替换为
Calendar.set(year + 1900, month, date)
.
请注意,年份字段是此后的年数1900
,因此您的示例代码很可能无法按预期执行.这就是重点.
通常,Date
API仅支持现代西方日历,具有特殊指定的组件,并且如果设置字段则行为不一致.
在Calendar
和GregorianCalendar
API是比好Date
,和第三方乔达时间的API被普遍认为是最好的.在Java 8中,他们介绍了java.time
这些软件包,现在推荐这些软件包.
请注意,Calendar.getTime()
在白天时间部分默认为当前时间的意义上,这是不确定的.
要重现,请尝试多次运行以下代码:
Calendar c = Calendar.getInstance();
c.set(2010, 2, 7); // NB: 2 means March, not February!
System.err.println(c.getTime());
Run Code Online (Sandbox Code Playgroud)
输出例如:
Sun Mar 07 10:46:21 CET 2010
Run Code Online (Sandbox Code Playgroud)
几分钟后运行完全相同的代码会产生:
Sun Mar 07 10:57:51 CET 2010
Run Code Online (Sandbox Code Playgroud)
因此,虽然set()
强制对应字段来更正值,但它会泄漏其他字段的系统时间.(上面用Sun jdk6&jdk7测试过)
由于 Date 构造函数已被弃用,您可以尝试此代码。
import java.util.Calendar;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 6);// for 6 hour
calendar.set(Calendar.MINUTE, 0);// for 0 min
calendar.set(Calendar.SECOND, 0);// for 0 sec
calendar.set(1996,0,26);// for Date [year,month(0 to 11), date]
Date date = new Date(calendar.getTimeInMillis());// calendar gives long value
String mConvertedDate = date.toString();// Fri Jan 26 06:00:00 GMT+05:30 1996
Run Code Online (Sandbox Code Playgroud)
大多数Java开发人员目前使用第三方软件包Joda-Time.它被广泛认为是一种更好的实施方式.
但是Java 8将有一个新的java.time.*包.请参阅本文,介绍JDK 8的新日期和时间API.
归档时间: |
|
查看次数: |
184779 次 |
最近记录: |