假设我有一个非常简单的类,其日期字段如下所示。我该如何创建它的对象?
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);
}
}
}
答案 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.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 类不使用构造函数。而是使用静态工厂方法,例如now
,of
,from
和parse
。