我试图将两个日期保存到序列化中。 bin
个文件。我使用Calendar class
获取当前日期,然后我将其添加30天。所以我尝试保存两个日期变量fd
(第一个日期)和ed
(到期日期)。如果我将它们更改为expiration_date_serial文件中的Strings
,那么当我尝试将它们保存为Date
时,它们会在这两行上抛出错误:
exp_date.fd = current_formateddate;
exp_date.ed = formateddate;
错误: 不兼容的类型:java.lang.String无法转换为java.util.Date
可运行的课程:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class GetCurrentDate {
public static void main(String[] args) {
// get current date
DateFormat currentdateFormat = new SimpleDateFormat("MM/dd/yy");
Date current_date = new Date();
String current_formateddate = currentdateFormat.format(current_date);
System.out.println("Current date: " + (current_formateddate));
// ADD 30 days to the current date
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, 30);
Date d = c.getTime();
String formateddate = dateFormat.format(d);
System.out.println("+ 30 days: " + formateddate);
// Serialization start
expiration_date_serial exp_date = new expiration_date_serial();
exp_date.fd = current_formateddate;
exp_date.ed = formateddate;
String fileName = "data.bin";
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream(fileName));
os.writeObject(exp_date);
os.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Done writing...");
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
fileName));
expiration_date_serial p = (expiration_date_serial) is.readObject();
System.out.println("First Date = " + p.fd +
" Expiration Date = " + p.ed);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其他课程
import java.io.Serializable;
import java.util.Date;
public class expiration_date_serial implements Serializable {
public Date fd;//First Date
public Date ed;//Expiration Date
}
答案 0 :(得分:3)
在Java中,您不能将类型为String的值分配给Date类型的字段,这就是错误的原因。它甚至在序列化之前就会发生。
您最明显的选择是:
您应该更好地决定什么适合您的需求。
答案 1 :(得分:0)
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.plusDays( 30 )
.toString()
Answer by Orlangure是正确的,关于跨类型分配。
此外,其他问题包括:
旧的日期时间类设计不当,令人困惑,而且很麻烦。避免他们。现在是遗留的,取而代之的是java.time类。
ISO 8601标准定义了日期时间值的文本格式。这些格式在各种文化中都是明确的,直观的,实用的。日期值的标准格式为YYYY-MM-DD,例如2016-10-23
。
在解析和生成字符串以表示日期时间值时,java.time类默认使用ISO 8601。
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
要生成符合ISO 8601标准的字符串,只需致电toString
。
String output = today.toString(); // 2016-10-23
要解析,只需致电parse
。
LocalDate ld = LocalDate.parse( "2016-10-23" );
您可以添加或减去一定的时间。只需调用plus…
和minus…
方法。
LocalDate thirtyDaysAgo = ld.minusDays( 30 );
LocalDate oneMonthAgo = ld.minusMonths( 1 );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。