我需要一个日期对象的日期2014-02-11.我不能像这样直接创建它,
Date myDate = new Date(2014, 02, 11);
Run Code Online (Sandbox Code Playgroud)
所以我做的如下,
Calendar myCalendar = new GregorianCalendar(2014, 2, 11);
Date myDate = myCalendar.getTime();
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法在java中创建日期对象?
Adr*_*hum 92
第一个问题:在月份中传入2可能会给你一些意想不到的事情:月份是零基础,这意味着2实际上是3月.
我不知道你正在寻找什么是"简单"的方式,因为我觉得使用Calendar已经很容易了.
记得在月份中使用正确的常量:
Date date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11).getTime();
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用DateFormat,我通常有这样的工具:
public static Date parseDate(String date) {
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(date);
} catch (ParseException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以简单地写
Date myDate = parseDate("2014-02-14");
Run Code Online (Sandbox Code Playgroud)
我更喜欢另一种选择:不再使用Java日期/日历.切换到JODA时间或Java时间(也称为JSR310,JDK 8+中提供).您可以使用它LocalDate来表示日期,这可以通过以下方式轻松创建
LocalDate myDate =LocalDate.parse("2014-02-14");
// or
LocalDate myDate2 = new LocalDate(2014, 2, 14);
// or, in JDK 8+ Time
LocalDate myDate3 = LocalDate.of(2014, 2, 14);
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 25
LocalDate.of( 2014 , 2 , 11 )
Run Code Online (Sandbox Code Playgroud)
如果你坚持使用可怕的旧java.util.Date类,请从现代java.time类转换.
java.util.Date // Terrible old legacy class, avoid using. Represents a moment in UTC.
.from( // New conversion method added to old classes for converting between legacy classes and modern classes.
LocalDate // Represents a date-only value, without time-of-day and without time zone.
.of( 2014 , 2 , 11 ) // Specify year-month-day. Notice sane counting, unlike legacy classes: 2014 means year 2014, 1-12 for Jan-Dec.
.atStartOfDay( // Let java.time determine first moment of the day. May *not* start at 00:00:00 because of anomalies such as Daylight Saving Time (DST).
ZoneId.of( "Africa/Tunis" ) // Specify time zone as `Continent/Region`, never the 3-4 letter pseudo-zones like `PST`, `EST`, or `IST`.
) // Returns a `ZonedDateTime`.
.toInstant() // Adjust from zone to UTC. Returns a `Instant` object, always in UTC by definition.
) // Returns a legacy `java.util.Date` object. Beware of possible data-loss as any microseconds or nanoseconds in the `Instant` are truncated to milliseconds in this `Date` object.
Run Code Online (Sandbox Code Playgroud)
如果你想要"简单",你应该在Java 8中使用新的java.time包,而不是与Java捆绑在一起的臭名昭着的java.util.Date和.Calendar类.
Java 8及更高版本中内置的java.time框架取代了麻烦的旧java.util.Date/.Calendar类.
LocalDatejava.time提供了一个类来表示没有任何时间或时区的仅日期值.你确实需要一个时区来确定一个日期,比如巴黎早些时候比蒙特利尔更新.该ZoneId课程适用于时区.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Run Code Online (Sandbox Code Playgroud)
转储到控制台:
System.out.println ( "today: " + today + " in zone: " + zoneId );
Run Code Online (Sandbox Code Playgroud)
今天:2015-11-26在区域:亚洲/新加坡
或使用工厂方法指定年,月,日.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
Run Code Online (Sandbox Code Playgroud)
localDate:2014-02-11
或者传递一个月号1-12而不是DayOfWeek枚举对象.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Run Code Online (Sandbox Code Playgroud)
在LocalDate将其调整为时区之前,A 没有任何实际意义.在java.time中,我们应用时区来生成ZonedDateTime对象.这也意味着一个时间,但是什么时间?通常有意义的是与一天中的第一时刻一起去.您可能认为这意味着时间00:00:00.000,但并非总是如此,因为夏令时(DST)和其他异常情况.我们要求java.time通过调用来确定一天中的第一个时刻,而不是假设那个时间atStartOfDay.
指定适当的时区名称,格式continent/region,如America/Montreal,Africa/Casablanca或Pacific/Auckland.切勿使用3-4字母缩写,例如EST或IST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!).
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
Run Code Online (Sandbox Code Playgroud)
zdt:2014-02-11T00:00 + 08:00 [亚洲/新加坡]
对于后端工作(业务逻辑,数据库,数据存储和交换),我们通常使用UTC时区.在java.time中,Instant该类表示UTC时间轴上的时刻.可以通过调用从ZonedDateTime中提取Instant对象toInstant.
Instant instant = zdt.toInstant();
Run Code Online (Sandbox Code Playgroud)
时间:2014-02-10T16:00:00Z
你应该java.util.Date完全避免使用类.但是,如果必须与尚未针对java.time更新的旧代码进行互操作,则可以来回转换.查看添加到旧类的新转换方法.
java.util.Date d = java.util.from( instant ) ;
Run Code Online (Sandbox Code Playgroud)
…和…
Instant instant = d.toInstant() ;
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,和更多.
更新:Joda-Time库现在处于维护模式,并建议迁移到java.time类.我将这一部分留给历史.
首先,Joda-Time使用合理的编号,所以二月2不是1.另一件事,Joda-Time DateTime真正知道它所分配的时区,而不像java.util.Date似乎有时区但没有.
别忘了时区.否则你将获得JVM的默认值.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" ); // Language: Bahasa Melayu (?). Country: Singapore.
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Run Code Online (Sandbox Code Playgroud)
转储到控制台......
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Run Code Online (Sandbox Code Playgroud)
跑的时候......
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
Run Code Online (Sandbox Code Playgroud)
如果您需要转换为java.util.Date以与其他类一起使用...
java.util.Date date = dateTimeSingapore.toDate();
Run Code Online (Sandbox Code Playgroud)
edu*_*nti 10
我认为最好的方法是使用一个SimpleDateFormat对象.
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateString = "2014-02-11";
Date dateObject = sdf.parse(dateString); // Handle the ParseException here
Run Code Online (Sandbox Code Playgroud)
从Java8:
import java.time.Instant;
import java.util.Date;
Date date = Date.from(Instant.parse("2000-01-01T00:00:00.000Z"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
181000 次 |
| 最近记录: |