Add support for UTC times in iCal imports
According to the iCal standard (4.3.12 Time):
UTC time, or absolute time, is identified by a LATIN CAPITAL LETTER
Z suffix character (US-ASCII decimal 90), the UTC designator,
appended to the time value.
Parse such time values properly when importing iCal files.
Fixes GitHub issue #3.
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
@@ -1054,6 +1054,7 @@ long get_item_time(long);
|
||||
int get_item_hour(long);
|
||||
int get_item_min(long);
|
||||
long date2sec(struct date, unsigned, unsigned);
|
||||
long utcdate2sec(struct date, unsigned, unsigned);
|
||||
char *date_sec2date_str(long, const char *);
|
||||
void date_sec2date_fmt(long, const char *, char *);
|
||||
long date_sec_change(long, int, int);
|
||||
|
||||
21
src/ical.c
21
src/ical.c
@@ -477,7 +477,7 @@ ical_chk_header(FILE * fd, char *buf, char *lstore, unsigned *lineno,
|
||||
* where DATE is 'YYYYMMDD' and TIME is 'HHMMSS'.
|
||||
* The time and 'T' separator are optional (in the case of an day-long event).
|
||||
*
|
||||
* Optionnaly, if the type pointer is given, specify if it is an event
|
||||
* Optionally, if the type pointer is given, specify if it is an event
|
||||
* (no time is given, meaning it is an all-day event), or an appointment
|
||||
* (time is given).
|
||||
*
|
||||
@@ -485,22 +485,27 @@ ical_chk_header(FILE * fd, char *buf, char *lstore, unsigned *lineno,
|
||||
*/
|
||||
static long ical_datetime2long(char *datestr, ical_vevent_e * type)
|
||||
{
|
||||
const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 5;
|
||||
const int NOTFOUND = 0, FORMAT_DATE = 3, FORMAT_DATETIME = 6,
|
||||
FORMAT_DATETIMEZ = 7;
|
||||
struct date date;
|
||||
unsigned hour, min;
|
||||
long datelong;
|
||||
unsigned hour, min, sec;
|
||||
char c;
|
||||
long datelong ;
|
||||
int format;
|
||||
|
||||
format = sscanf(datestr, "%04u%02u%02uT%02u%02u",
|
||||
&date.yyyy, &date.mm, &date.dd, &hour, &min);
|
||||
format = sscanf(datestr, "%04u%02u%02uT%02u%02u%02u%c",
|
||||
&date.yyyy, &date.mm, &date.dd, &hour, &min, &sec, &c);
|
||||
if (format == FORMAT_DATE) {
|
||||
if (type)
|
||||
*type = EVENT;
|
||||
datelong = date2sec(date, 0, 0);
|
||||
} else if (format == FORMAT_DATETIME) {
|
||||
} else if (format == FORMAT_DATETIME || format == FORMAT_DATETIMEZ) {
|
||||
if (type)
|
||||
*type = APPOINTMENT;
|
||||
datelong = date2sec(date, hour, min);
|
||||
if (format == FORMAT_DATETIMEZ && c == 'Z')
|
||||
datelong = utcdate2sec(date, hour, min);
|
||||
else
|
||||
datelong = date2sec(date, hour, min);
|
||||
} else {
|
||||
datelong = NOTFOUND;
|
||||
}
|
||||
|
||||
25
src/utils.c
25
src/utils.c
@@ -386,6 +386,31 @@ long date2sec(struct date day, unsigned hour, unsigned min)
|
||||
return t;
|
||||
}
|
||||
|
||||
time_t
|
||||
utcdate2sec(struct date day, unsigned hour, unsigned min)
|
||||
{
|
||||
char *tz;
|
||||
time_t t;
|
||||
|
||||
tz = getenv("TZ");
|
||||
if (tz)
|
||||
tz = mem_strdup(tz);
|
||||
setenv("TZ", "", 1);
|
||||
tzset();
|
||||
|
||||
t = date2sec(day, hour, min);
|
||||
|
||||
if (tz) {
|
||||
setenv("TZ", tz, 1);
|
||||
mem_free(tz);
|
||||
} else {
|
||||
unsetenv("TZ");
|
||||
}
|
||||
tzset();
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
/* Return a string containing the date, given a date in seconds. */
|
||||
char *date_sec2date_str(long sec, const char *datefmt)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user