Skip to content

Commit 8e226f2

Browse files
authored
Merge pull request #499 from codebude/feature/enhance-datetime-handling-in-ical-generator
Added support for UTC and DateTimeOffsets in VEVENT generator
2 parents 8742e07 + f370952 commit 8e226f2

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

QRCoder/PayloadGenerator.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,20 @@ public class CalendarEvent : Payload
18771877
private readonly string subject, description, location, start, end;
18781878
private readonly EventEncoding encoding;
18791879

1880+
/// <summary>
1881+
/// Generates a calender entry/event payload.
1882+
/// </summary>
1883+
/// <param name="subject">Subject/title of the calender event</param>
1884+
/// <param name="description">Description of the event</param>
1885+
/// <param name="location">Location (lat:long or address) of the event</param>
1886+
/// <param name="start">Start time (incl. UTC offset) of the event</param>
1887+
/// <param name="end">End time (incl. UTC offset) of the event</param>
1888+
/// <param name="allDayEvent">Is it a full day event?</param>
1889+
/// <param name="encoding">Type of encoding (universal or iCal)</param>
1890+
public CalendarEvent(string subject, string description, string location, DateTimeOffset start, DateTimeOffset end, bool allDayEvent, EventEncoding encoding = EventEncoding.Universal) : this(subject, description, location, start.UtcDateTime, end.UtcDateTime, allDayEvent, encoding)
1891+
{
1892+
}
1893+
18801894
/// <summary>
18811895
/// Generates a calender entry/event payload.
18821896
/// </summary>
@@ -1893,9 +1907,17 @@ public CalendarEvent(string subject, string description, string location, DateTi
18931907
this.description = description;
18941908
this.location = location;
18951909
this.encoding = encoding;
1896-
string dtFormat = allDayEvent ? "yyyyMMdd" : "yyyyMMddTHHmmss";
1897-
this.start = start.ToString(dtFormat);
1898-
this.end = end.ToString(dtFormat);
1910+
string dtFormatStart = "yyyyMMdd", dtFormatEnd = "yyyyMMdd";
1911+
if (!allDayEvent)
1912+
{
1913+
dtFormatStart = dtFormatEnd = "yyyyMMddTHHmmss";
1914+
if (start.Kind == DateTimeKind.Utc)
1915+
dtFormatStart = "yyyyMMddTHHmmssZ";
1916+
if (end.Kind == DateTimeKind.Utc)
1917+
dtFormatEnd = "yyyyMMddTHHmmssZ";
1918+
}
1919+
this.start = start.ToString(dtFormatStart);
1920+
this.end = end.ToString(dtFormatEnd);
18991921
}
19001922

19011923
public override string ToString()

QRCoderTests/PayloadGeneratorTests.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ public void calendarevent_should_build_universal()
816816
var location = "Programmer's paradise, Beachtown, Paradise";
817817
var alldayEvent = false;
818818
var begin = new DateTime(2016, 01, 03, 12, 00, 00);
819-
var end = new DateTime(2016, 01, 03, 14, 30, 0);
819+
var end = new DateTime(2016, 01, 03, 14, 30, 00);
820820
var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal;
821821

822822
var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding);
@@ -843,6 +843,42 @@ public void calendarevent_should_build_ical()
843843
}
844844

845845

846+
[Fact]
847+
[Category("PayloadGenerator/CalendarEvent")]
848+
public void calendarevent_should_build_with_utc_datetime()
849+
{
850+
var subject = "Release party";
851+
var description = "A small party for the new QRCoder. Bring some beer!";
852+
var location = "Programmer's paradise, Beachtown, Paradise";
853+
var alldayEvent = false;
854+
var begin = new DateTime(2016, 01, 03, 12, 00, 00, DateTimeKind.Utc);
855+
var end = new DateTime(2016, 01, 03, 14, 30, 00, DateTimeKind.Utc);
856+
var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal;
857+
858+
var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding);
859+
860+
generator.ToString().ShouldBe($"BEGIN:VEVENT{Environment.NewLine}SUMMARY:Release party{Environment.NewLine}DESCRIPTION:A small party for the new QRCoder. Bring some beer!{Environment.NewLine}LOCATION:Programmer's paradise, Beachtown, Paradise{Environment.NewLine}DTSTART:20160103T120000Z{Environment.NewLine}DTEND:20160103T143000Z{Environment.NewLine}END:VEVENT");
861+
}
862+
863+
864+
[Fact]
865+
[Category("PayloadGenerator/CalendarEvent")]
866+
public void calendarevent_should_build_with_utc_offset()
867+
{
868+
var subject = "Release party";
869+
var description = "A small party for the new QRCoder. Bring some beer!";
870+
var location = "Programmer's paradise, Beachtown, Paradise";
871+
var alldayEvent = false;
872+
var begin = new DateTimeOffset(2016, 01, 03, 12, 00, 00, new TimeSpan(3, 0, 0));
873+
var end = new DateTimeOffset(2016, 01, 03, 14, 30, 00, new TimeSpan(3, 0, 0));
874+
var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal;
875+
876+
var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding);
877+
878+
generator.ToString().ShouldBe($"BEGIN:VEVENT{Environment.NewLine}SUMMARY:Release party{Environment.NewLine}DESCRIPTION:A small party for the new QRCoder. Bring some beer!{Environment.NewLine}LOCATION:Programmer's paradise, Beachtown, Paradise{Environment.NewLine}DTSTART:20160103T090000Z{Environment.NewLine}DTEND:20160103T113000Z{Environment.NewLine}END:VEVENT");
879+
}
880+
881+
846882
[Fact]
847883
[Category("PayloadGenerator/CalendarEvent")]
848884
public void calendarevent_should_build_allday()

0 commit comments

Comments
 (0)