关于手动设置日期和时间:手动设置日期和时间 – java

Set the date and time manually - java

我正试着让一个客户确定他们想要预订的日期和时间。我已经完成的代码在保存时会在文本文件中创建大量文本,并在再次尝试加载时崩溃。

这是我添加预订的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public static List<Reservation> addReservations(List<Reservation> reservations, List<Customer> customers) {
    int newReservationId = Reservation.getNumberOfReservations() + 1;
    String startString = readString("Enter Reservation date");
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date date = null;
    try {
        date = sdf.parse(startString);
    } catch (ParseException ex) {
        Logger.getLogger(ProjectIncrement5.class.getName()).log(Level.SEVERE, null, ex);
    }
    Calendar dateTime = Calendar.getInstance();
    dateTime.setTime(date);

    listCustomers(customers, reservations);
    int reservationCustomerId = readInt("Enter Customer Id", Customer.getNumberOfCustomers(), 1);
    Customer reservationCustomer = customers.get(reservationCustomerId - 1);
    Reservation res = new Reservation(newReservationId, dateTime, reservationCustomer);
    reservations.add(res);
    return reservations;
}

预订类别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class Reservation {

private int reservationId;
private Calendar dateTime;
private Customer customer;


private static int numberOfReservations = 0;

public Reservation() {
    this.reservationId = 0;
    this.dateTime = null;
     this.customer = null;


    numberOfReservations++;
}

public Reservation(int reservationId, Calendar dateTime, Customer customer) {
    this.reservationId = reservationId;
    this.dateTime = dateTime;
      this.customer = customer;

    numberOfReservations++;
}

public static int getNumberOfReservations() {
    return numberOfReservations;
}

public int getReservationId() {
    return reservationId;
}

public void setreservationId(int reservationId) {
    this.reservationId = reservationId;
}

public Calendar getDateTime() {
    return dateTime;
}

    public Customer getCustomer()
{
    return customer;
}

public void setCustomer(Customer customer)
{
    this.customer = customer;
}    



public String setDateTime() {
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String dateString = formatter.format(this.dateTime.getTime());
    return dateString;
}

@Override
public String toString() {
    return"Reservation id:" + getReservationId() +","
            +"Date/Time" + setDateTime() +
   "customer:" + getCustomer();

}
}

这是保存到文本文件中导致错误的原因:

1:java.util.GregorianCalendar[time=851385600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=1996,MONTH=11,WEEK_OF_YEAR=52,WEEK_OF_MONTH=4,DAY_OF_MONTH=24,DAY_OF_YEAR=359,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]:4:<

我认为在获取日历实例时会发生错误,但我不确定如何更简单地执行此操作并解决此问题。有人能帮忙吗?


避免传统日期时间类

现代方法使用java.time类。避免麻烦的、混乱的、设计不好的旧遗留日期时间类,如Calendar

埃多克斯1〔13〕

收集日期部分。如果输入错误,则捕获任何DateTimeParseException

1
2
3
4
5
6
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu" ) ;
try {
    LocalDate ld = LocalDate.parse( input , f ) ;
} catch ( DateTimeParseException e ) {
    …
}

似乎你没有明确地跟踪一天中的时间。因此,LocalDate类就足够了。

ISO 8601标准

将数据序列化为文本文件时,应使用标准的ISO 8601格式。这些格式设计为实用且不含糊,易于机器解析,易于跨文化的人阅读,且不假定精通英语。

在解析和生成字符串时,java.time类默认使用标准格式。只需调用toString生成。

1
String output = ld.toString() ;  // Ex: 2017-01-23

。关于java.time

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendar、&SimpleDateFormat

现在处于维护模式的joda time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。

在哪里获取java.time类?

  • Java SE 8、Java SE 9及以后
    • 内置。
    • 标准JAVA API的一部分与捆绑实现。
    • Java 9增加了一些次要的特性和修复。
  • Java SE 6和Java SE 7
    • 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
  • 安卓
    • threetenabp项目专门为Android调整threeten backport(如上所述)。
    • 看看如何使用三连珠……

threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。


我接受JordiCastilla的回答,也希望告诉其他人也这样做。您可以使用Calendar.toString()方法将日期和时间保存到文件中,而可以使用以下代码

1
2
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
String stringToFile = df.format(date);//you can send this string to the file which you want to store the Date & Time


问题是您将Calendar.toString()而不是实际日期存储到文本文件中。

看看你发布的内容:

firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=1996,MONTH=11,WEEK_OF_YEAR=52,WEEK_OF_MONTH=4,DAY_OF_MONTH=24,DAY_OF_YEAR=359,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]

那似乎是个正确的日期。我会说的更多,这似乎是一个真正完整的约会,有很多信息不是吗????;)

我不知道该如何存储这个日期,但是,例如,如果您想以dd/MM/yyyy格式存储日期,请使用这行代码检查它是否是有效的日期(您已经在代码中这样做了)。

1
2
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
date = sdf.parse(startString);

检查完后,如果startString是有效的,则不需要创建任何Calendar实例,只需将startString写入文本文件即可。

更新:

So in my Reservation class, instead of having: private Calendar dateTime I will take that out and just have: private String startString?

不。其理念是:

  • 在Java类中,存储在一个特定的EDCOX1中5Ω(EDOCX1,3)是可以的,但是戴特也可以。
  • 在文本文件中,通过String发送人可读的日期。

很抱歉,我不能更具体地说,我不能执行您的代码,因为缺少很多部分(CustomerreadIntlistCustomers等)。