diff --git a/QRCoder/PayloadGenerator.cs b/QRCoder/PayloadGenerator.cs
index 56949682..f0e75378 100644
--- a/QRCoder/PayloadGenerator.cs
+++ b/QRCoder/PayloadGenerator.cs
@@ -1877,6 +1877,20 @@ public class CalendarEvent : Payload
private readonly string subject, description, location, start, end;
private readonly EventEncoding encoding;
+ ///
+ /// Generates a calender entry/event payload.
+ ///
+ /// Subject/title of the calender event
+ /// Description of the event
+ /// Location (lat:long or address) of the event
+ /// Start time (incl. UTC offset) of the event
+ /// End time (incl. UTC offset) of the event
+ /// Is it a full day event?
+ /// Type of encoding (universal or iCal)
+ 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)
+ {
+ }
+
///
/// Generates a calender entry/event payload.
///
@@ -1893,9 +1907,17 @@ public CalendarEvent(string subject, string description, string location, DateTi
this.description = description;
this.location = location;
this.encoding = encoding;
- string dtFormat = allDayEvent ? "yyyyMMdd" : "yyyyMMddTHHmmss";
- this.start = start.ToString(dtFormat);
- this.end = end.ToString(dtFormat);
+ string dtFormatStart = "yyyyMMdd", dtFormatEnd = "yyyyMMdd";
+ if (!allDayEvent)
+ {
+ dtFormatStart = dtFormatEnd = "yyyyMMddTHHmmss";
+ if (start.Kind == DateTimeKind.Utc)
+ dtFormatStart = "yyyyMMddTHHmmssZ";
+ if (end.Kind == DateTimeKind.Utc)
+ dtFormatEnd = "yyyyMMddTHHmmssZ";
+ }
+ this.start = start.ToString(dtFormatStart);
+ this.end = end.ToString(dtFormatEnd);
}
public override string ToString()
diff --git a/QRCoderTests/PayloadGeneratorTests.cs b/QRCoderTests/PayloadGeneratorTests.cs
index 717516e8..878a4115 100644
--- a/QRCoderTests/PayloadGeneratorTests.cs
+++ b/QRCoderTests/PayloadGeneratorTests.cs
@@ -816,7 +816,7 @@ public void calendarevent_should_build_universal()
var location = "Programmer's paradise, Beachtown, Paradise";
var alldayEvent = false;
var begin = new DateTime(2016, 01, 03, 12, 00, 00);
- var end = new DateTime(2016, 01, 03, 14, 30, 0);
+ var end = new DateTime(2016, 01, 03, 14, 30, 00);
var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal;
var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding);
@@ -843,6 +843,42 @@ public void calendarevent_should_build_ical()
}
+ [Fact]
+ [Category("PayloadGenerator/CalendarEvent")]
+ public void calendarevent_should_build_with_utc_datetime()
+ {
+ var subject = "Release party";
+ var description = "A small party for the new QRCoder. Bring some beer!";
+ var location = "Programmer's paradise, Beachtown, Paradise";
+ var alldayEvent = false;
+ var begin = new DateTime(2016, 01, 03, 12, 00, 00, DateTimeKind.Utc);
+ var end = new DateTime(2016, 01, 03, 14, 30, 00, DateTimeKind.Utc);
+ var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal;
+
+ var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding);
+
+ 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");
+ }
+
+
+ [Fact]
+ [Category("PayloadGenerator/CalendarEvent")]
+ public void calendarevent_should_build_with_utc_offset()
+ {
+ var subject = "Release party";
+ var description = "A small party for the new QRCoder. Bring some beer!";
+ var location = "Programmer's paradise, Beachtown, Paradise";
+ var alldayEvent = false;
+ var begin = new DateTimeOffset(2016, 01, 03, 12, 00, 00, new TimeSpan(3, 0, 0));
+ var end = new DateTimeOffset(2016, 01, 03, 14, 30, 00, new TimeSpan(3, 0, 0));
+ var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal;
+
+ var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding);
+
+ 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");
+ }
+
+
[Fact]
[Category("PayloadGenerator/CalendarEvent")]
public void calendarevent_should_build_allday()