sabre/vobject
The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects
5.0.0
26M downloads/mo
#782 most downloaded on Packagist
sabre-io/vobject
What this package is like to depend on
Last release 1 months ago
07 Jul 2026
Release timing varies
gaps range from 3 weeks to 10 months
Nearly every release is documented
notes for 87 of 88 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
99 releases · first in 2012
5 releases in the last 12 months
see the full history below
Release timeline
99 releases · Aug 2012 to Jul 2026Releases
latest 60 of 99-
5.0.007 Jul 2026Release notes
Open source →5.0.0 (2026-07-07)
- #767 Drop PHP 7.4 8.0 8.1 and support PHP 8.2 and up (@phil-davis)
- #769 fix: minor code fixes (@phil-davis)
- #586 PHP types (@tcitworld @phil-davis)
This major release v5 declares function parameter and return types across the
codebase. Users will need to be careful to call functions/methods with the
correct types.Support for PHP below 8.2 has been dropped.
This release supports PHP 8.2 and up.Release notes
Open source →- #767 Drop PHP 7.4 8.0 8.1 and support PHP 8.2 and up (@phil-davis)
- #769 fix: minor code fixes (@phil-davis)
- #586 PHP types (@tcitworld @phil-davis)
This major release v5 declares function parameter and return types across the codebase. Users will need to be careful to call functions/methods with the correct types.
Support for PHP below 8.2 has been dropped. This release supports PHP 8.2 and up.
-
4.6.107 Jul 2026Release notes
Open source →4.6.1 (2026-07-07)
- #776 fix: preserve UTC 'Z' indicator in Period JSON serialization (@bastien-roucaries @guimard @phil-davis)
Release notes
Open source →- #776 fix: preserve UTC 'Z' indicator in Period JSON serialization (@bastien-roucaries @guimard @phil-davis)
-
4.6.031 May 2026Release notes
Open source →4.6.0 (2026-05-31)
- #718 feat(VCard): add getByTypes method (@JimKnoxx)
- #756 fix: Update deprecated timezone names (@ralflang)
A new getByTypes method has been added for Vcards. This allows the caller to get a specific property that has the specified list of types. See issue #717 for more details.
Various deprecated time zones are updated to their new/current values by #756
FindFromTimezoneMap::find no longer throws an (undocumented) exception when a timezone is not found. It will now return null, which was already a documented possible return in the return type definition. The method now conforms to its documented behaviour. But callers may have been expecting to catch an “unexpected” exception, so this change may require changes for callers that need to handle occurences of invalid time zones.Release notes
Open source →- #718 feat(VCard): add getByTypes method (@JimKnoxx)
- #756 fix: Update deprecated timezone names (@ralflang)
-
4.5.931 May 2026Release notes
Open source →4.5.9 (2026-05-31)
- #759 fix(itip): handle null old calendar/event (@ChristophWurst)
-
4.5.812 Jan 2026Release notes
Open source →4.5.8 (2026-01-12)
- #721: Fix variable scope (@KristofferFM)
- #723: Broker shouldn't add EXDATE property with floating timezone (@KristofferFM)
- #726: Improved check on property name (@KristofferFM)
- #727: Improve error checks in Mimedir parser (@KristofferFM)
- #728: Removing attendee from scheduled recurring event should generate an EXDATE property (@KristofferFM)
- #735: use RDATE in time range check and use all instances (@SebastianKrupinski)
- #743: send participation reply on fresh event (@SebastianKrupinski)
Release notes
Open source →- #721: Fix variable scope (@KristofferFM)
- #723: Broker shouldn't add EXDATE property with floating timezone (@KristofferFM)
- #726: Improved check on property name (@KristofferFM)
- #727: Improve error checks in Mimedir parser (@KristofferFM)
- #728: Removing attendee from scheduled recurring event should generate an EXDATE property (@KristofferFM)
- #735: use RDATE in time range check and use all instances (@SebastianKrupinski)
- #743: send participation reply on fresh event (@SebastianKrupinski)
-
4.5.717 Apr 2025Release notes
Open source →- #618: Add new exchangetimezone 'Amsterdam, Berlin, Bern, Rom, Stockholm, Wien' (@chr-is)
- #674: Allow unknown value data types for VALUE (@heiglandreas)
- #707: add phpdoc return types for arrayaccess methods (@smhg)
-
4.5.614 Oct 2024Release notes
Open source →4.5.6 (2024-10-14)
- #662: add PHP 8.4 to CI (@phil-davis)
- #669: fix: check if event status was changed to cancelled and generate appropriate message (@SebastianKrupinski)
- #673: Fix Implicitly marking parameter $param as nullable is deprecated (@cedric-anne)
- #675: refactor: Replace dirname(FILE) with DIR (@ChristophWurst)
- #692: Throw InvalidDataException when RRule is invalid (@mathroc)
Provides support for PHP 8.4
Full Changelog: 4.5.5...4.5.6
Release notes
Open source →- #662: add PHP 8.4 to CI (@phil-davis)
- #669: fix: check if event status was changed to cancelled and generate appropriate message (@SebastianKrupinski)
- #673: Fix Implicitly marking parameter $param as nullable is deprecated (@cedric-anne)
- #675: refactor: Replace dirname(FILE) with DIR (@ChristophWurst)
- #692: Throw InvalidDataException when RRule is invalid (@mathroc)
-
4.5.502 Jul 2024Release notes
Open source →4.5.5 (2024-07-02)
- #632: Add PHP 8.3 to CI (@phil-davis)
- #649: add lineIndex and lineString properties to a Property Node (@JohnRDOrazio)
- #652: ITip\Broker: handle timezones in replies to exception events (@gharlan)
- #654: chore: stop exporting php-cs-fixer config (@phil-davis)
- #656: Yearly rrule compliance by the iterator (@kroky)
- #658: throw ParseException when null input is provided (@phil-davis)
- #653: Handle summer time jumps in event recurrences (@phil-davis)
Release notes
Open source →- #632: Add PHP 8.3 to CI (@phil-davis)
- #649: add lineIndex and lineString properties to a Property Node (@JohnRDOrazio)
- #652: ITip\Broker: handle timezones in replies to exception events (@gharlan)
- #654: chore: stop exporting php-cs-fixer config (@phil-davis)
- #656: Yearly rrule compliance by the iterator (@kroky)
- #658: throw ParseException when null input is provided (@phil-davis)
- #653: Handle summer time jumps in event recurrences (@phil-davis)
-
4.5.409 Nov 2023Release notes
Open source →- #619: fixed issue: Undefined index: plusminus (@sash04ek)
- #622: Create Issue467Test.php for 619 (@sash04ek)
- #623: docs: fix type definition for oldCalendar (@kesselb)
-
4.5.322 Jan 2023Release notes
Open source →4.5.3 (2023-01-22)
- #607: Apply 'Support sabre/xml v4' and needed code changes to 4.5 branch (@phil-davis)
Release 4.5.2 was accidentally done from master branch, which had other changes that have various backward-compatibility issues and may not work with older PHP before 7.4.
This release 4.5.3 is from the 4.5 branch. It includes the dependency change from PR #603 to allow using sabre/xml v3 or v4 as well as v2.
To do that, a couple of return types had to be declared - xmlSerialize returns void and xmlDeserialize returns array. Those declarations are supported from PHP 7.1 onward, so that is fine for the 4.5 release series.If you start using sabre/xml major version 3 or 4 and are redeclaring/inheriting these in your code, then you may also need to make the matching return-type declarations. But this small thing is a lot better than the large amount of code changes that were accidentally released as 4.5.2.
Release notes
Open source →- #607: Apply 'Support sabre/xml v4' and needed code changes to 4.5 branch (@phil-davis)
-
4.5.220 Jan 2023 -
4.5.109 Oct 2022 -
4.5.017 Aug 2022Release notes
Open source →- #579: Update .gitattributes (@cedric-anne)
- #561: PHP 8.1 deprecated support for null values in its APIs (@mstilkerich)
- #571: Fully ignore invalid lines (@heiglandreas)
- #564: Fix infinite loop caused by yearly with bySetPos (@liurxliu)
- #567: Endless loop problem in RRuleIterator::nextDaily (@KristofferFM)
- #466: Add support for MEMBER in a VCard (@sash04ek)
- #559: Handle Vobjects without closing tag (@sash04ek)
- #582: Fix bug in by year day (@KAYLukas)
-
4.4.315 Jul 2022 -
4.4.224 Jun 2022Release notes
Open source →- #565: lowercase mailto:-addresses in getNormalizedValue() (@pk1234)
- #568: Add NICKNAME fallback for VCards without FNs (@Evengard)
- #573: Component/select: Before uppercasing $child->group, make sure it isn't null (@algernon)
- #575: Fix encoding detection on PHP 8.1 (@come-nc)
-
4.4.107 Dec 2021Release notes
Open source →#557: Fix Iterator method signatures and avoid passing null as separator for implode (PHP 8.1 support) (@come-nc)
-
4.4.016 Nov 2021 -
4.3.814 Nov 2021Release notes
Open source →- #538: fix EventIterator returns wrong end endTime (@floerke)
- #541: Reordering of the attendees is not a significant change (@floerke)
- #543: Reordering of vevent is not a significant change (@floerke)
-
4.3.704 Nov 2021 -
4.3.603 Nov 2021 -
4.3.512 Feb 2021Release notes
Open source →- #523: Fix setting properties with group assignment (@mstilkerich)
- #532: Make use of until parameter in nextMonthly function (@jaircuevajunior)
-
4.3.404 Feb 2021Release notes
Open source →- #529: Reassign modified date in yearly rrule (@laoneo)
- #525: Add .gitattributes to reduce package size (@fezfez)
-
4.3.309 Nov 2020 -
4.3.203 Oct 2020 -
4.3.113 Jul 2020Release notes
Open source →- #510: Fix an incomplete phpdoc type annotation (@mstilkerich)
- #505: Refactor unit test code for phpunit9 (@phil-davis)
- #500: Standardize CI (@phil-davis)
- #496: CI tooling changes (@JeroenVanOort)
-
4.3.031 Jan 2020Release notes
Open source →- Added support for PHP 7.4, dropped support for PHP 7.0 (@phil-davis)
- #487: Added phpstan coverage, updated testsuite for phpunit8 (@phil-davis, @JeroenVanOort)
- #495: refactored maps to use ::class notation (@JeroenVanOort)
-
4.2.214 Jan 2020Release notes
Open source →- #465: Add TZ in iTip REPLY iTip messages
- #486: Add PHONE-NUMBER value type (used for TEL in vCard 3.0)
-
4.2.118 Dec 2019Release notes
Open source →- #469, #451: fix compat with php 7.4
- #443: prevent running in indefinite loop
- #449: Preventing creating a component for a root document
- #450: Fix parse with option Forgiving with trailing equal
- #459: fixed typo in VCalendar which resulting in usage of the wrong TimeZone
- #462: Broker::parseEventForOrganizer copies DTSTAMP from $eventInfo that causes broken scheduling
-
4.2.019 Feb 2019Release notes
Open source →- #432: DTSTAMP must be specified in UTC
- #435: ORGANIZER e-mail address are case-insensitive
- #441: Repairing BASE64 encoded vCard version 3
-
4.2.0-alpha126 Sep 2018 pre-release -
4.1.620 Apr 2018Release notes
Open source →- #406, #407, #408, #409: Another round of performance improvements in serialization of properties (@gharlan, @staabm)
- #410: Fixes in iTip for handling
BYDAY=SA,SO(@gharlan) - #381: Fixes in iTip handling of
SCHEDULE-FORCE-SEND(@alecpl)
-
4.1.508 Mar 2018 -
4.1.422 Dec 2017Release notes
Open source →- #383: Fix possible infinite loop in RRuleIterator, when the RRule FREQ is YEARLY and it uses BYYEARDAY only (@mvdnes).
- #392: Improved significant change detection. This should reduce the number of unneeded update emails in scheduling systems. (@alecpl).
- #395: Removed
Canada/East-Saskatchewantimezone, as it got removed from PHP as well. (@remicollet).
-
4.1.318 Oct 2017Release notes
Open source →- #363: Repair script and de-duplicate properties that are only allowed once, but appear more than once. (@ddolcimascolo).
- #377: Added Pacific Time (US & Canada) as exchange timezone
- #384: Added fallback for VCards without
FN
-
4.1.206 Dec 2016Release notes
Open source →- #340: Support for
BYYEARDAYrecurrence whenFREQ=YEARLY. (@PHPGangsta) - #341: Support for
BYWEEKNOrecurrence whenFREQ=YEARLY. (@PHPGangsta) - Updated to the latest windows timezone data mappings.
- #344: Auto-detecting more Outlook 365-generated timezone identifiers. (@jpirkey)
- #348:
FreeBusyGeneratorcan now accept streams. - Support sabre/xml 1.5 and 2.0.
- #355: Support
DateTimeInterfacein more places where onlyDateTimewas supported. (@gharlan). - #351: Fixing an inclusive/exclusive problem with
isInTimeRangeandfastForwardwith all-day events. (@strokyl, thanks you are brilliant).
- #340: Support for
-
4.1.115 Jul 2016Release notes
Open source →- #327: Throwing
InvalidDataExceptionin more cases where invalid iCalendar dates and times were provided. (@rsto) - #331: Fix dealing with multiple overridden instances falling on the same date/time (@afedyk-sugarcrm).
- #333: Fix endless loop on invalid
BYMONTHvalues in recurrence. (@PHPGangsta) - #339: Fixed a few
validate()results when repair is off. (@PHPGangsta) - #338: Stripping invalid
BYMONTH=rules duringvalidate()(@PHPGangsta) - #336: Fix incorrect
BYSECOND=validation. (@PHPGangsta)
- #327: Throwing
-
4.1.007 Apr 2016Release notes
Open source →- #309: When expanding recurring events, the first event should also have a
RECURRENCE-IDproperty. - #306: iTip REPLYs to the first instance of a recurring event was not handled correctly.
- Slightly better error message during validation of
NandADRproperties. - #312: Correctly extracting timezone in the iTip broker, even when we don't have a master event. (@vkomrakov-sugar).
- When validating a component's property that must appear once and which could automatically be repaired, make sure we report the change as 'repaired'.
- Added a PHPUnitAssertions trait. This trait makes it easy to compare two vcards or iCalendar objects semantically.
- Better error message when parsing objects with an invalid
VALUEparameter.
- #309: When expanding recurring events, the first event should also have a
-
4.0.312 Mar 2016Release notes
Open source →- #300: Added
VCard::getByType()to quickly get a property with a specificTYPEparameter. (@kbond) - #302:
UNTILwas not encoded correctly when converting to jCal. (@GrahamLinagora) - #303:
COUNTis now encoded as an int in jCal instead of a string. (@strokyl) - #295:
RRULEnow has more validation and repair rules.
- #300: Added
-
4.0.211 Jan 2016Release notes
Open source →- #288: Only decode
CHARSETif we're reading vCard 2.1. If it appears in any other document, we must ignore it.
- #288: Only decode
-
4.0.104 Jan 2016Release notes
Open source →- #284: When generating
CANCELiTip messages, we now includeDTEND. (@kewisch)
- #284: When generating
-
4.0.012 Dec 2015Release notes
Open source →- #274: When creating new vCards, the default vCard version is now 4.0.
- #275:
VEVENT,VTODOandVCARDnow automatically get aUIDandDTSTAMPproperty if this was not already specified. ParseExceptionnow extends\Exception.Sabre\VObject\Reader::readnow has a$charsetargument.- #272:
Sabre\VObject\Recur\EventIterator::$maxInstancesis nowSabre\VObject\Settings::$maxRecurrencesand is also honored by the FreeBusyGenerator. - #278:
expand()did not work correctly on events with sub-components.
-
4.0.0-beta102 Dec 2015 pre-releaseRelease notes
Open source →- #258: Support for expanding events that use
RDATE. (@jabdoa2) - #258: Correctly support TZID for events that use
RDATE. (@jabdoa2) - #240:
Component\VCalendar::expand()now returns a new expandedVCalendarobject, instead of editing the existingVCalendarin-place. This is a BC break. - #265: Using the new
InvalidDataExceptionin place ofInvalidArgumentExceptionandLogicExceptionin all places where we fail because there was something wrong with input data. - #227: Always add
VALUE=URItoPHOTOproperties. - #235: Always add
VALUE=URItoURLproperties. - It's now possible to override which class is used instead of
Component\VCalendarorComponent\VCardduring parsing. - #263: Lots of small cleanups. (@jakobsack)
- #220: Automatically stop recurring after 3500 recurrences.
- #41: Allow user to set different encoding than UTF-8 when decoding vCards.
- #41: Support the
ENCODINGparameter from vCard 2.1. Both ISO-8859-1 and Windows-1252 are currently supported. - #185: Fix encoding/decoding of
TIMEvalues in jCal/jCard.
- #258: Support for expanding events that use
-
4.0.0-alpha204 Sep 2015 pre-releaseRelease notes
Open source →- Updated windows timezone file to support new mexican timezone.
- #239: Added a
BirthdayCalendarGenerator. (@DominikTo) - #250:
isInTimeRange()now considers the timezone for floating dates and times. (@armin-hackmann) - Added a duplicate vcard merging tool for the command line.
- #253:
isInTimeRange()now correctly handles events that throw theNoInstancesExceptionexception. (@migrax, @DominikTo) - #254: The parser threw an
E_NOTICEfor certain invalid objects. It now correctly throws aParseException.
-
4.0.0-alpha117 Jul 2015 pre-releaseRelease notes
Open source →- sabre/vobject now requires PHP 5.5.
- #244: PHP7 support.
- Lots of speedups and reduced memory usage!
- #160: Support for xCal a.k.a. RFC6321! (@Hywan)
- #192: Support for xCard a.k.a. RFC6351! (@Hywan)
- #139: We now accept
DateTimeInterfacewherever it acceptedDateTimebefore in arguments. This means that eitherDateTimeorDateTimeImmutablemay be used everywhere. - #242: Full support for the
VAVAILABILITYcomponent, and calculatingVFREEBUSYbased onVAVAILABILITYdata. - #186: Fixing conversion of
UTC-OFFSETproperties when going back and forward between jCal and iCalendar. - Properties, Components and Parameters now implement PHP's
JsonSerializableinterface. - #139: We now always return
DateTimeImmutablefrom any method. This could potentially have big implications if you manipulate Date objects anywhere. - #161: Simplified
ElementListby extendingArrayIterator. - Removed
RecurrenceIterator(use Recur\EventIterator instead). - Now using php-cs-fixer to automatically enforce and correct CS.
- #233: The
+00:00timezone is now recognized as UTC. (@c960657) - #237: Added a
destroy()method to all documents. This method breaks any circular references, allowing PHP to free up memory. - #197: Made accessing properties and objects by their name a lot faster. This especially helps objects that have a lot of sub-components or properties, such as large iCalendar objects.
- #197: The
$childrenproperty on components has been changed frompublictoprotected. Use thechildren()method instead to get a flat list of objects. - #244: The
FloatandIntegerclasses have been renamed toFloatValueandIntegerValueto allow PHP 7 compatibility.
-
3.5.307 Oct 2016Release notes
Open source →- #331: Fix dealing with multiple overridden instances falling on the same date/time (@afedyk-sugarcrm).
-
3.5.224 Apr 2016Release notes
Open source →- #312: Backported a fix related to iTip processing of events with timezones, without a master event.
-
3.5.107 Apr 2016Release notes
Open source →- #309: When expanding recurring events, the first event should also have a
RECURRENCE-IDproperty. - #306: iTip REPLYs to the first instance of a recurring event was not handled correctly.
- #309: When expanding recurring events, the first event should also have a
-
3.5.011 Jan 2016Release notes
Open source →- This release supports PHP 7, contrary to 3.4.x versions.
- BC Break:
Sabre\VObject\Property\Floathas been renamed toSabre\VObject\Property\FloatValue. - BC Break:
Sabre\VObject\Property\Integerhas been renamed toSabre\VObject\Property\IntegerValue.
-
3.4.911 Jan 2016Release notes
Open source →- This package now specifies in composer.json that it does not support PHP 7. For PHP 7, use version 3.5.x or 4.x.
-
3.4.804 Jan 2016Release notes
Open source →- #284: When generating
CANCELiTip messages, we now includeDTEND. (@kewisch).
- #284: When generating
-
3.4.704 Sep 2015Release notes
Open source →- #253: Handle
isInTimeRangefor recurring events that have 0 valid instances. (@DominikTo, @migrax).
- #253: Handle
-
3.4.606 Aug 2015Release notes
Open source →- #250: Recurring all-day events are incorrectly included in time range requests when not using UTC in the time range. (@armin-hackmann)
-
3.4.502 Jun 2015Release notes
Open source →- #229: Converting vcards from 3.0 to 4.0 that contained a
LANGproperty would throw an error.
- #229: Converting vcards from 3.0 to 4.0 that contained a
-
3.4.427 May 2015Release notes
Open source →- #228: Fixed a 'party crasher' bug in the iTip broker. This would break scheduling in some cases.
-
3.4.319 May 2015Release notes
Open source →- #219: Corrected validation of
EXDATEproperties with more than one value. - #212:
BYSETPOSwith values below-1was broken and could cause infinite loops. - #211: Fix
BYDAY=-5THin recurrence iterator. (@lindquist) - #216:
ENCODINGparameter is now validated for all document types. - #217: Initializing vCard
DATEobjects with a PHP DateTime object will now work correctly. (@thomascube)
- #219: Corrected validation of
-
3.4.225 Feb 2015 -
3.4.124 Feb 2015Release notes
Open source →- A minor change to ensure that unittests work correctly in the sabre/dav test-suite.
-
3.4.023 Feb 2015Release notes
Open source →- #196: Made parsing recurrence rules a lot faster on big calendars.
- Updated windows timezone mappings to latest unicode version.
- #202: Support for parsing and validating
VAVAILABILITYcomponents. (@Hywan) - #195: PHP 5.3 compatibility in 'generatevcards' script. (@rickdenhaan)
- #205: Improving handling of multiple
EXDATEwhen processing iTip changes. (@armin-hackmann) - #187: Fixed validator rules for
LAST-MODIFIEDproperties. - #188: Retain floating times when generating instances using
Recur\EventIterator. - #203: Skip tests for timezones that are not supported on older PHP versions, instead of a hard fail.
- #204: Dealing a bit better with vCard date-time values that contained milliseconds. (which is normally invalid). (@armin-hackmann)
-
3.3.510 Jan 2015Release notes
Open source →- #168: Expanding calendars now removes objects with recurrence rules that don't have a valid recurrence instance.
- #177: SCHEDULE-STATUS should not contain a reason phrase, only a status code.
- #175: Parser can now read and skip the UTF-8 BOM.
- #179: Added
isFloatingtoDATE-TIMEproperties. - #179: Fixed jCal serialization of floating
DATE-TIMEproperties. - #173: vCard converter failed for
X-ABDATEproperties that had noX-ABLABEL. - #180: Added
PROFILE_CALDAVandPROFILE_CARDDAVto enable validation rules specific for CalDAV/CardDAV servers. - #176: A missing
UIDis no longer an error, but a warning for the vCard validator, unlessPROFILE_CARDDAVis specified.
-
3.3.419 Nov 2014Release notes
Open source →- #154: Converting
ANNIVERSARYtoX-ANNIVERSARYandX-ABDATEand vice-versa when converting to/from vCard 4. - #154: It's now possible to easily select all vCard properties belonging to
a single group with
$vcard->{'ITEM1.'}syntax. (@armin-hackmann) - #156: Simpler way to check if a string is UTF-8. (@Hywan)
- Unittest improvements.
- #159: The recurrence iterator, freebusy generator and iCalendar DATE and DATE-TIME properties can now all accept a reference timezone when working floating times or all-day events.
- #159: Master events will no longer get a
RECURRENCE-IDwhen expanding. - #159:
RECURRENCE-IDfor all-day events will now be correct when expanding. - #163: Added a
getTimeZone()method toVTIMEZONEcomponents.
- #154: Converting