将日期保存到序列化文件

时间:2016-10-23 21:07:26

标签: java date

我试图将两个日期保存到序列化中。 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
}

2 个答案:

答案 0 :(得分:3)

在Java中,您不能将类型为String的值分配给Date类型的字段,这就是错误的原因。它甚至在序列化之前就会发生。

您最明显的选择是:

  • 将字段类型更改为String
  • 不要将Date对象转换为String并按原样保存它们

您应该更好地决定什么适合您的需求。

答案 1 :(得分:0)

TL;博士

LocalDate.now( ZoneId.of( "America/Montreal" ) )
         .plusDays( 30 )
         .toString()

详细

Answer by Orlangure是正确的,关于跨类型分配。

此外,其他问题包括:

  • 使用旧的过时遗留类进行日期时间处理。
  • 序列化日期值的格式选择不佳。
  • 错误地选择将日期时间类用于仅限日期的值。

java.time

旧的日期时间类设计不当,令人困惑,而且很麻烦。避免他们。现在是遗留的,取而代之的是java.time类。

ISO 8601

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore