我无法使用 iCal4j 正确设置事件的日期
I can't set properly the dates for an event with iCal4j
我正在使用 iCal4j 为 Spring 启动应用程序生成一个预订日历,但所有日期都多了一个月和少了两天,这比它应该的要多。
例如:(dd/MM/yyyy) 在 iCal 中 22/03/2018 我得到 20/04/2018.
调试中,我看到所有的日期和值都是正确的。因此我猜问题开始于这个 class:
的构造函数
net.fortuna.ical4j.model.Date
Date start = new Date(arrival);
Date end = new Date(departure);
这是我的方法代码,其中日期的类型是 LocalDate:
public Calendar getPropertyICal(Integer idproperty) throws SocketException {
//Initializing an iCal4j calendar
Calendar iCal = new Calendar();
iCal.getProperties().add(new ProdId("-//RentalWebs//iCal4j 1.0 by Ben Fortuna//EN"));
iCal.getProperties().add(Version.VERSION_2_0);
iCal.getProperties().add(CalScale.GREGORIAN);
HostInfo host = new SimpleHostInfo("rentalwebs.com");
List<Booking> upcomingBookings = bookingRepository.getUpcomingBookings(idproperty);
for(Booking bkng : upcomingBookings){
java.util.Calendar arrival = java.util.Calendar.getInstance();
arrival.set(java.util.Calendar.MONTH, bkng.getDatefrom().getMonth().getValue());
arrival.set(java.util.Calendar.DAY_OF_MONTH, bkng.getDatefrom().getDayOfMonth());
arrival.set(java.util.Calendar.YEAR, bkng.getDatefrom().getYear());
LocalDate lastNight = bkng.getDateto().minusDays(1);
java.util.Calendar departure = java.util.Calendar.getInstance();
departure.set(java.util.Calendar.MONTH, lastNight.getMonth().getValue());
departure.set(java.util.Calendar.DAY_OF_MONTH, lastNight.getDayOfMonth());
departure.set(java.util.Calendar.YEAR, lastNight.getYear());
Location propertyName = new Location(propertyRepository.getPropertyById(bkng.getIdproperty()).getName());
String guestName = bkng.getSurname() + ", " + bkng.getName();
Date start = new Date(arrival);
Date end = new Date(departure);
VEvent booking = new VEvent(start, end, guestName);
UidGenerator ug = new UidGenerator(host, LocalDate.now().toString());//Unique identifier
booking.getProperties().add(ug.generateUid());
booking.getProperties().add(propertyName);
iCal.getComponents().add(booking);
}
return iCal;
}
服务器位于法兰克福,java.util.Calendarclass的构造函数获取中欧语言环境,没问题。
Calendar.MONTH 是 zero-based,所以如果您的预订 class 使用 1-12 作为月份,您需要在设置日历时减去一个。
不确定是哪一天,但也许是四月而不是三月这一事实可能会对日期产生影响..
我正在使用 iCal4j 为 Spring 启动应用程序生成一个预订日历,但所有日期都多了一个月和少了两天,这比它应该的要多。
例如:(dd/MM/yyyy) 在 iCal 中 22/03/2018 我得到 20/04/2018.
调试中,我看到所有的日期和值都是正确的。因此我猜问题开始于这个 class:
的构造函数net.fortuna.ical4j.model.Date
Date start = new Date(arrival);
Date end = new Date(departure);
这是我的方法代码,其中日期的类型是 LocalDate:
public Calendar getPropertyICal(Integer idproperty) throws SocketException {
//Initializing an iCal4j calendar
Calendar iCal = new Calendar();
iCal.getProperties().add(new ProdId("-//RentalWebs//iCal4j 1.0 by Ben Fortuna//EN"));
iCal.getProperties().add(Version.VERSION_2_0);
iCal.getProperties().add(CalScale.GREGORIAN);
HostInfo host = new SimpleHostInfo("rentalwebs.com");
List<Booking> upcomingBookings = bookingRepository.getUpcomingBookings(idproperty);
for(Booking bkng : upcomingBookings){
java.util.Calendar arrival = java.util.Calendar.getInstance();
arrival.set(java.util.Calendar.MONTH, bkng.getDatefrom().getMonth().getValue());
arrival.set(java.util.Calendar.DAY_OF_MONTH, bkng.getDatefrom().getDayOfMonth());
arrival.set(java.util.Calendar.YEAR, bkng.getDatefrom().getYear());
LocalDate lastNight = bkng.getDateto().minusDays(1);
java.util.Calendar departure = java.util.Calendar.getInstance();
departure.set(java.util.Calendar.MONTH, lastNight.getMonth().getValue());
departure.set(java.util.Calendar.DAY_OF_MONTH, lastNight.getDayOfMonth());
departure.set(java.util.Calendar.YEAR, lastNight.getYear());
Location propertyName = new Location(propertyRepository.getPropertyById(bkng.getIdproperty()).getName());
String guestName = bkng.getSurname() + ", " + bkng.getName();
Date start = new Date(arrival);
Date end = new Date(departure);
VEvent booking = new VEvent(start, end, guestName);
UidGenerator ug = new UidGenerator(host, LocalDate.now().toString());//Unique identifier
booking.getProperties().add(ug.generateUid());
booking.getProperties().add(propertyName);
iCal.getComponents().add(booking);
}
return iCal;
}
服务器位于法兰克福,java.util.Calendarclass的构造函数获取中欧语言环境,没问题。
Calendar.MONTH 是 zero-based,所以如果您的预订 class 使用 1-12 作为月份,您需要在设置日历时减去一个。
不确定是哪一天,但也许是四月而不是三月这一事实可能会对日期产生影响..