如何在Java中初始化Date类型的变量

时间:2018-03-03 00:45:50

标签: java

假设我有一个非常简单的类,其日期字段如下所示。我该如何创建它的对象?

import java.util.Date;

public class Test {
    public Test(Date date) {
        System.out.println("The date is " + date);
    }
    public static void main(String[] args) {
    Test t1 = new Test(new Date());                        // This is working
    Test t2 = new Test(Sat Mar 03 00:43:32 GMT 2018);      // Not working
    Test t3 = new Test("Sat Mar 03 00:43:32 GMT 2018");    // Not working
    }
}

即使我提供的日期与新Date()提供的格式相同,我仍然会收到错误消息。为什么呢?

如何传递可变日期可接受的日期?

更新:以下是我使用弃用方法的工作原理。有什么改进吗?

    import java.util.Date;
    public class Test1 {
     public Test1(Date date) {
     System.out.println("The date is " + date);
     }
     public static void main(String[] args) {
     Test1 t1 = new Test1(new Date(118, 01, 03)); // This is working
     }
    }

这是一种更好的工作方式,但仍然不够好

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

    public class Test1 {

     public Test1(Date date) {
       System.out.println("The date is " + date);
     }

     public static void main(String[] args) {
      DateFormat df = new SimpleDateFormat("dd/MM/yyyy");


     try {
      Test1 t2 = new Test1(df.parse("02/02/2018")); // This is working
     }
     catch (Exception e) {
     System.out.println(e);
     }

     }
    }

2 个答案:

答案 0 :(得分:0)

您的Test构造函数采用Date类型的对象。

如果要传递String,然后从中实例化Date,则应创建一个重载构造函数,其参数类型为String

public Test(String dateString) {
    Date date = new Date(dateString);
    System.out.println("The date is " + date);
}

请注意,Java中的字符串是双引号,如new Test("Quoted String")中所示。您无法传递未加引号的字符串,如示例new Test(Unquoted String)中所示。

答案 1 :(得分:0)

java.time

麻烦的java.util.Date类已在Java 8及更高版本的Instant类中取代。 (巨大的改进)

您需要将此类(对象)的实例传递给类的构造函数方法,或者传递给类的setter方法。

Instant表示UTC时间轴上的点,分辨率为纳秒。要捕获当前时刻,请致电now

类别:

public class Test {
    Instant instant ;
    public Test( Instant instantArg ) {
        this.instant = instantArg ;
        System.out.println( "The instant is " + this.instant.toString() );
    }
    // Add optional setter method if you desire. 
}

用法:

Instant instant = Instant.now() ;
Test test = new Test( instant ) ;

或者,

Test test = new Test() ;
test.setInstant( instant ) ;

其他途径包括工厂方法或构建器。但是在获得更多经验之后再看看那些。

您可能希望在特定时区指定日期时间。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 12 , 34 ) ;
ZoneId z = ZoneId.of( “Pacific/Auckland” ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Instant instant = zdt.toInstant() ;  // Adjust from other zone to UTC. Same moment, different wall-clock time.
Test test = new Test( instant ) ;

智能对象与哑字符串

不要将日期时间对象与表示其值的String混淆。日期时间对象(如Instant)不是String,但它可以生成String并且可以解析字符串。

String s = instant.toString() ;  // Generate a String in standard ISO 8601 format.
  

2018-12-17T18:00Z

和...

Instant instant = Instant.parse( “2018-12-17T18:00Z” ) ;

您可以添加其他构造函数或setter方法来接受要解析为日期时间对象的此类字符串。但通常情况下,你的班级承担解决所带来的所有问题/问题的责任更好。我将负责将必要的Instant对象实例化到调用程序员的肩膀上。

顺便提一下,您可能会注意到 java.time 类不使用构造函数。而是使用静态工厂方法,例如nowoffromparse