.NET 类,用于创建和维护 vCalendar 信息
.NET 类,用于创建和维护 vCalendar 信息
引言
我正在将我网站的日历部分移植到 ASP.NET,并遇到了将事件信息导出到 vCalendar 文件的问题,以便将其导入到 Outlook 或其他支持 vCalendar/iCalendar 格式的日历应用程序中。因此,我创建了一个类来封装所有信息的格式化。
Public Class vCalendar
Public Events As vEvents
Public Overrides Function ToString() As String
Dim result As New System.Text.StringBuilder()
result.AppendFormat("BEGIN:VCALENDAR{0}", _
System.Environment.NewLine)
'The following two lines seem to be required by
'Outlook to get the alarm settings
result.AppendFormat("VERSION:2.0{0}", System.Environment.NewLine)
result.AppendFormat("METHOD:PUBLISH{0}", _
System.Environment.NewLine)
Dim item As vEvent
For Each item In Events
result.Append(item.ToString())
Next
result.AppendFormat("END:VCALENDAR{0}", _
System.Environment.NewLine)
Return result.ToString
End Function
Public Sub New(ByVal Value As vEvent)
Me.Events = New vEvents()
Me.Events.Add(Value)
End Sub
Public Sub New()
Me.Events = New vEvents()
End Sub
Public Class vAlarm
Public Trigger As TimeSpan
'Amount of time before event to display alarm
Public Action As String
'Action to take to notify user of alarm
Public Description As String 'Description of the alarm
Public Sub New()
Trigger = TimeSpan.FromDays(1)
Action = "DISPLAY"
Description = "Reminder"
End Sub
Public Sub New(ByVal SetTrigger As TimeSpan)
Trigger = SetTrigger
Action = "DISPLAY"
Description = "Reminder"
End Sub
Public Sub New(ByVal SetTrigger As TimeSpan, _
ByVal SetAction As String, ByVal SetDescription As String)
Trigger = SetTrigger
Action = SetAction
Description = SetDescription
End Sub
Public Overrides Function ToString() As String
Dim result As New System.Text.StringBuilder()
result.AppendFormat("BEGIN:VALARM{0}", _
System.Environment.NewLine)
result.AppendFormat("TRIGGER:P{0}DT{1}H{2}M{3}", _
Trigger.Days, Trigger.Hours, Trigger.Minutes, _
System.Environment.NewLine)
result.AppendFormat("ACTION:{0}{1}", Action, _
System.Environment.NewLine)
result.AppendFormat("DESCRIPTION:{0}{1}", _
Description, System.Environment.NewLine)
result.AppendFormat("END:VALARM{0}", _
System.Environment.NewLine)
Return result.ToString
End Function
End Class
Public Class vEvent
Public UID As String 'Unique identifier for the event
Public DTStart As Date 'Start date of event.
'Will be automatically converted to GMT
Public DTEnd As Date 'End date of event.
'Will be automatically converted to GMT
Public DTStamp As Date 'Timestamp.
'Will be automatically converted to GMT
Public Summary As String 'Summary/Subject of event
Public Organizer As String 'Can be mailto: url or just a name
Public Location As String
Public Description As String
Public URL As String
Public Alarms As vAlarms 'Alarms needed for this event
Public Overrides Function ToString() As String
Dim result As New System.Text.StringBuilder()
result.AppendFormat("BEGIN:VEVENT{0}", _
System.Environment.NewLine)
result.AppendFormat("UID:{0}{1}", UID, _
System.Environment.NewLine)
result.AppendFormat("SUMMARY:{0}{1}", _
Summary, System.Environment.NewLine)
result.AppendFormat("ORGANIZER:{0}{1}", Organizer, _
System.Environment.NewLine)
result.AppendFormat("LOCATION:{0}{1}", Location, _
System.Environment.NewLine)
result.AppendFormat("DTSTART:{0}{1}", _
DTStart.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _
System.Environment.NewLine)
result.AppendFormat("DTEND:{0}{1}", _
DTEnd.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _
System.Environment.NewLine)
result.AppendFormat("DTSTAMP:{0}{1}", _
Now.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _
System.Environment.NewLine)
result.AppendFormat("DESCRIPTION:{0}{1}", Description, _
System.Environment.NewLine)
If URL.Length > 0 Then result.AppendFormat("URL:{0}{1}", _
URL, System.Environment.NewLine)
Dim item As vAlarm
For Each item In Alarms
result.Append(item.ToString())
Next
result.AppendFormat("END:VEVENT{0}", _
System.Environment.NewLine)
Return result.ToString
End Function
Public Sub New()
Me.Alarms = New vAlarms()
End Sub
End Class
Public Class vAlarms
' The first thing to do when building a CollectionBase
' class is to inherit from System.Collections.CollectionBase
Inherits System.Collections.CollectionBase
Public Overloads Function Add(ByVal Value As vAlarm) As vAlarm
' After you inherit the CollectionBase class, you
' can access an intrinsic object
' called InnerList that represents your collection.
' InnerList is of type ArrayList.
Me.InnerList.Add(Value)
Return Value
End Function
Public Overloads Function Item(ByVal Index As Integer) As vAlarm
' To retrieve an item from the InnerList,
' pass the index of that item to the .Item property.
Return CType(Me.InnerList.Item(Index), vAlarm)
End Function
Public Overloads Sub Remove(ByVal Index As Integer)
' This Remove expects an index.
Dim cust As vAlarm
cust = CType(Me.InnerList.Item(Index), vAlarm)
If Not cust Is Nothing Then
Me.InnerList.Remove(cust)
End If
End Sub
End Class
Public Class vEvents
' The first thing to do when building a CollectionBase
' class is to inherit from System.Collections.CollectionBase
Inherits System.Collections.CollectionBase
Public Overloads Function Add(ByVal Value As vEvent) As vEvent
' After you inherit the CollectionBase class,
' you can access an intrinsic object
' called InnerList that represents your collection.
' InnerList is of type ArrayList.
Me.InnerList.Add(Value)
Return Value
End Function
Public Overloads Function Item(ByVal Index As Integer) As vEvent
' To retrieve an item from the InnerList,
' pass the index of that item to the .Item property.
Return CType(Me.InnerList.Item(Index), vEvent)
End Function
Public Overloads Sub Remove(ByVal Index As Integer)
' This Remove expects an index.
Dim cust As vEvent
cust = CType(Me.InnerList.Item(Index), vEvent)
If Not cust Is Nothing Then
Me.InnerList.Remove(cust)
End If
End Sub
End Class
End Class
我计划在发现更多属性时添加它们,但目前 Outlook 支持的基本上就是这些属性了。我也想听取大家对我的设计的反馈意见。
vCalendar 规范
以下是一些关于 vCalendar 规范的链接(感谢 Tommi)