add timezone

This commit is contained in:
Mylloon 2022-08-16 17:56:24 +02:00
parent 0e2ca5bcd1
commit ced1fdac3e
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -1,11 +1,24 @@
use chrono::TimeZone;
use ics::{ use ics::{
parameters,
properties::{Class, Description, DtEnd, DtStart, Location, Summary, Transp}, properties::{Class, Description, DtEnd, DtStart, Location, Summary, Transp},
Event, ICalendar, Event, ICalendar, Standard,
}; };
pub fn export(courses: Vec<crate::timetable::models::Course>, filename: &str) { pub fn export(courses: Vec<crate::timetable::models::Course>, filename: &str) {
let mut calendar = ICalendar::new("2.0", "cal8tor"); let mut calendar = ICalendar::new("2.0", "cal8tor");
// Add Europe/Paris timezone
let timezone_name = "Europe/Paris";
calendar.add_timezone(ics::TimeZone::standard(
timezone_name,
Standard::new(
dt_ical(chrono::Utc.ymd(1970, 1, 1).and_hms(0, 0, 0)),
"+0100",
"+0200",
),
));
// Create events which contains the information regarding the course // Create events which contains the information regarding the course
for course in courses { for course in courses {
let mut event = Event::new( let mut event = Event::new(
@ -25,10 +38,14 @@ pub fn export(courses: Vec<crate::timetable::models::Course>, filename: &str) {
} }
// Start time of the course // Start time of the course
event.push(DtStart::new(dt_ical(course.dtstart.unwrap()))); let mut date_start = DtStart::new(dt_ical(course.dtstart.unwrap()));
date_start.append(parameters!("TZID" => timezone_name));
event.push(date_start);
// End time of the course // End time of the course
event.push(DtEnd::new(dt_ical(course.dtend.unwrap()))); let mut date_end = DtEnd::new(dt_ical(course.dtend.unwrap()));
date_end.append(parameters!("TZID" => timezone_name));
event.push(date_end);
// Room location // Room location
event.push(Location::new(course.room)); event.push(Location::new(course.room));
@ -46,5 +63,5 @@ pub fn export(courses: Vec<crate::timetable::models::Course>, filename: &str) {
/// Transform the datetime from chrono to the ICS format /// Transform the datetime from chrono to the ICS format
/// See <https://github.com/hummingly/ics/issues/17#issue-985662287> /// See <https://github.com/hummingly/ics/issues/17#issue-985662287>
fn dt_ical(dt: chrono::DateTime<chrono::Utc>) -> String { fn dt_ical(dt: chrono::DateTime<chrono::Utc>) -> String {
format!("{}", dt.format("%Y%m%dT%H%M%SZ")) format!("{}", dt.format("%Y%m%dT%H%M%S"))
} }