77package at.bitfire.synctools.icalendar
88
99import at.bitfire.ical4android.EventReader
10+ import at.bitfire.synctools.icalendar.validation.ICalPreprocessor
1011import net.fortuna.ical4j.data.CalendarBuilder
1112import net.fortuna.ical4j.data.ParserException
1213import net.fortuna.ical4j.model.Component
@@ -15,6 +16,7 @@ import net.fortuna.ical4j.model.Parameter
1516import net.fortuna.ical4j.model.TemporalAmountAdapter
1617import net.fortuna.ical4j.model.TimeZone
1718import net.fortuna.ical4j.model.TimeZoneRegistryFactory
19+ import net.fortuna.ical4j.model.component.VEvent
1820import net.fortuna.ical4j.model.component.VTimeZone
1921import net.fortuna.ical4j.model.parameter.Email
2022import org.junit.Assert.assertEquals
@@ -108,6 +110,43 @@ class Ical4jTest {
108110 assertEquals(" 20210108T151500" , dt.toString())
109111 }
110112
113+ @Test
114+ fun `DTSTART in America_Asuncion from KOrganizer` () {
115+ // See https://github.com/bitfireAT/synctools/issues/113
116+ val vtzFromKOrganizer = " BEGIN:VCALENDAR\n " +
117+ " CALSCALE:GREGORIAN\n " +
118+ " VERSION:2.0\n " +
119+ " PRODID:-//K Desktop Environment//NONSGML KOrganizer 6.5.0 (25.08.0)//EN\n " +
120+ " BEGIN:VTIMEZONE\n " +
121+ " TZID:America/Asuncion\n " +
122+ " BEGIN:STANDARD\n " +
123+ " TZNAME:-03\n " +
124+ " TZOFFSETFROM:-0300\n " +
125+ " TZOFFSETTO:-0300\n " +
126+ " DTSTART:19700101T000000\n " +
127+ " END:STANDARD\n " +
128+ " END:VTIMEZONE\n " +
129+ " BEGIN:VEVENT\n " +
130+ " DTSTAMP:20250828T233827Z\n " +
131+ " CREATED:20250828T233750Z\n " +
132+ " UID:e5d424b9-d3f6-4ee0-bf95-da7537fca1fe\n " +
133+ " LAST-MODIFIED:20250828T233827Z\n " +
134+ " SUMMARY:Test Timezones\n " +
135+ " RRULE:FREQ=WEEKLY;COUNT=3;BYDAY=TH\n " +
136+ " DTSTART;TZID=America/Asuncion:20250828T130000\n " +
137+ " DTEND;TZID=America/Asuncion:20250828T133000\n " +
138+ " TRANSP:OPAQUE\n " +
139+ " END:VEVENT\n " +
140+ " END:VCALENDAR"
141+ val iCalFromKOrganizer = CalendarBuilder ().build(StringReader (vtzFromKOrganizer))
142+ ICalPreprocessor ().preprocessCalendar(iCalFromKOrganizer)
143+ val vEvent = iCalFromKOrganizer.getComponent<VEvent >(Component .VEVENT )
144+ val dtStart = vEvent.startDate
145+ // SHOULD BE UTC -3:
146+ // assertEquals(1756396800000, dtStart.date.time)
147+ // However is one hour later: 1756400400000
148+ }
149+
111150 @Test
112151 fun testTzKarachi () {
113152 // https://github.com/ical4j/ical4j/issues/491
0 commit comments