如何使用java中的值创建Date对象

Ban*_*ram 77 java date

我需要一个日期对象的日期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)

  • `return new SimpleDateFormat("yyyy-mm-dd").parse(date) ` 应该是 `return new SimpleDateFormat("yyyy-MM-dd").parse(date)` (2认同)

Bas*_*que 25

TL;博士

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.time

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/CasablancaPacific/Auckland.切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!).

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.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)

  • 只有一条评论.在"new DateTime(2014,02,11,0,0,timeZone);"字段中为零加前缀的实践可能不是优选的.虽然它适用于这种情况,但是,如果你传递`08`和`09`作为前缀为int literal的0表示八进制表示,它将不会编译为8月和9月.它甚至会在1000年之前给你意想不到的值,例如`new DateTime(0100,02,01,0,0,timeZone);`人们可能期望它是100AD但实际上它是64AD (3认同)
  • 亲爱的 Down-Voter,请在投票的同时留下批评。 (2认同)

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)


Tod*_*.Lu 8

从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)