{"id":13485735,"url":"https://github.com/ical4j/ical4j","last_synced_at":"2026-04-03T02:04:24.341Z","repository":{"id":547861,"uuid":"12554522","full_name":"ical4j/ical4j","owner":"ical4j","description":"A Java library for parsing and building iCalendar data models","archived":false,"fork":false,"pushed_at":"2026-03-27T22:47:58.000Z","size":25088,"stargazers_count":828,"open_issues_count":160,"forks_count":216,"subscribers_count":38,"default_branch":"develop","last_synced_at":"2026-03-28T15:43:23.772Z","etag":null,"topics":["icalendar","java","library","scheduling"],"latest_commit_sha":null,"homepage":"https://www.ical4j.org","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ical4j.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"benfortuna"}},"created_at":"2013-09-03T03:52:25.000Z","updated_at":"2026-03-27T22:48:02.000Z","dependencies_parsed_at":"2026-03-08T04:01:35.961Z","dependency_job_id":null,"html_url":"https://github.com/ical4j/ical4j","commit_stats":{"total_commits":2235,"total_committers":70,"mean_commits":"31.928571428571427","dds":0.4263982102908277,"last_synced_commit":"fa1ff08133b5ce15955a53074061dd4de9790ae5"},"previous_names":[],"tags_count":193,"template":false,"template_full_name":null,"purl":"pkg:github/ical4j/ical4j","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ical4j%2Fical4j","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ical4j%2Fical4j/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ical4j%2Fical4j/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ical4j%2Fical4j/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ical4j","download_url":"https://codeload.github.com/ical4j/ical4j/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ical4j%2Fical4j/sbom","scorecard":{"id":53099,"data":{"date":"2025-08-04","repo":{"name":"github.com/ical4j/ical4j","commit":"145537da792ab427e068dfe690e4c7202933bcc5"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":6.1,"checks":[{"name":"Code-Review","score":2,"reason":"Found 5/20 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"21 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish-snapshots.yml:23","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/run-build.yml:15","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/run-build.yml:34","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/run-check.yml:15","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scorecards.yml:20","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecards.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test.yml:9","Warn: jobLevel 'checks' permission set to 'write': .github/workflows/test.yml:10","Warn: no topLevel permission defined: .github/workflows/cifuzz.yml:1","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/create-release.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/publish-snapshots.yml:9","Warn: topLevel 'checks' permission set to 'write': .github/workflows/publish-snapshots.yml:10","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/run-build.yml:8","Info: topLevel permissions set to 'read-all': .github/workflows/run-check.yml:8","Info: topLevel permissions set to 'read-all': .github/workflows/scorecards.yml:11","Warn: no topLevel permission defined: .github/workflows/test.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/cifuzz.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/cifuzz.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cifuzz.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/cifuzz.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cifuzz.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/cifuzz.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/codeql-analysis.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/codeql-analysis.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/codeql-analysis.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/codeql-analysis.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-snapshots.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/publish-snapshots.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-snapshots.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/publish-snapshots.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-build.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/run-build.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-build.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/run-build.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-build.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/run-build.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-build.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/run-build.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-check.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/run-check.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-check.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/run-check.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecards.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/scorecards.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/scorecards.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/scorecards.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecards.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/scorecards.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecards.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/scorecards.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/test.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/test.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/ical4j/ical4j/test.yml/develop?enable=pin","Info:   0 out of  19 GitHub-owned GitHubAction dependencies pinned","Info:   5 out of  10 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish-snapshots.yml:17"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (16) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-15T00:06:21.485Z","repository_id":547861,"created_at":"2025-08-15T00:06:21.491Z","updated_at":"2025-08-15T00:06:21.491Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31196261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-30T12:28:04.769Z","status":"ssl_error","status_checked_at":"2026-03-30T12:28:01.577Z","response_time":138,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["icalendar","java","library","scheduling"],"created_at":"2024-07-31T18:00:30.775Z","updated_at":"2026-04-03T02:04:24.321Z","avatar_url":"https://github.com/ical4j.png","language":"Java","readme":"# iCal4j - iCalendar parser and object model\n\n[RFC2445]: https://tools.ietf.org/html/rfc2445\n[RFC2446]: https://tools.ietf.org/html/rfc2446\n[RFC2447]: https://tools.ietf.org/html/rfc2447\n\n[RFC5545]: https://tools.ietf.org/html/rfc5545\n[RFC5546]: https://tools.ietf.org/html/rfc5546\n[RFC6047]: https://datatracker.ietf.org/doc/html/rfc6047\n[RFC6868]: https://datatracker.ietf.org/doc/html/rfc6868\n[RFC7808]: https://datatracker.ietf.org/doc/html/rfc7808\n[RFC7953]: https://datatracker.ietf.org/doc/html/rfc7953\n[RFC7986]: https://datatracker.ietf.org/doc/html/rfc7986\n[RFC7529]: https://datatracker.ietf.org/doc/html/rfc7529\n[RFC9073]: https://datatracker.ietf.org/doc/html/rfc9073\n[RFC9074]: https://datatracker.ietf.org/doc/html/rfc9074\n[RFC9253]: https://www.rfc-editor.org/rfc/rfc9253.html\n\n[mavenrepo]: https://mvnrepository.com/artifact/org.mnode.ical4j/ical4j\n\n[Java Legacy Date-Time Code]: https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html\n\n[Introduction]: #introduction\n\n[Setup]: #setup\n[System requirements]: #system-requirements\n[Release downloads]: #release-downloads\n[Install with Maven]: #install-with-maven\n[Install with Gradle]: #install-with-gradle\n\n[Usage]: #usage\n\n[Examples]: #examples\n\n[References]: #references\n[Specifications]: #specifications\n\n[Configuration]: #configuration\n[Compatibility Hints]: #compatibility-hints\n\n[Limitations]: #limitations\n\n[Development]: #development\n[Building with Gradle]: #building-with-gradle\n[Redistribution]: #redistribution\n[Contributing]: #contributing\n\n#### Table of Contents\n\n1. [Introduction - What is iCal4j?][Introduction]\n2. [Setup - Download and installation of iCal4j][Setup]\n    - [System requirements - What is required to use iCal4j][System requirements]\n    - [Release downloads - Where to get iCal4j][Release downloads]\n    - [Install with Maven]\n    - [Install with Gradle]\n3. [Usage - The iCal4j object model and how to use it][Usage]\n    - [Examples - common usage scenarios][Examples]\n4. [References][References]\n5. [Configuration options][Configuration]\n    - [Compatibility Hints]\n7. [Development - Guide for contributing to the iCalj project][Development]\n    - [Building with Gradle]\n    - [Redistribution]\n    - [Contributing to iCal4j][Contributing]\n\n## Introduction\n\niCal4j is a Java library used to read and write iCalendar data streams as defined in [RFC2445]. The iCalendar standard\nprovides a common data format used to store information about calendar-specific data such as events, appointments, to-do\nlists, etc. All of the popular calendaring tools, such as Lotus Notes, Outlook and Apple's iCal also support the iCalendar\nstandard.\n\n - For a concise description of the goals and directions of iCal4j please\n take a look at the [open issues](https://github.com/ical4j/ical4j/issues).\n\n - You will find examples of how to use iCal4j in [the official website](https://www.ical4j.org/examples/)\n and throughout the [API documentation](https://ical4j.github.io/docs/ical4j/api).\n\n - Detailed descriptions of changes included in each release may be found\n in the [CHANGELOG](https://ical4j.github.io/docs/ical4j/release-notes).\n \n - iCal4j was created with the help of [Open Source](http://opensource.org) software.\n\n\n## Setup\n\n### System requirements\n\n - Version 4.x - Java 11 or later\n - Version 3.x - Java 8 or later\n - Version 2.x - Java 7 or later\n\n### Dependencies\n\nIn the interests of portability and compatibility with as many environments as possible, the number of dependent\nlibraries for iCal4j is kept to a minimum. The following describes the required (and optional) dependencies and the\nfunctionality they provide.\n\n* slf4j-api [required] - A logging meta-library with integration to different logging framework implementations. Used in all classes that require logging.\n\n* commons-lang3 [required] - Provides enhancements to the standard Java library, including support for custom `equals()` and `hashcode()`\nimplementations. Used in all classes requiring custom equality implementations.\n\n* commons-collections4 [required] - Provides enhancements to the standard Java collections API, including support for closures. Used in `net.fortuna.ical4j.validate.Validator` implementations to reduce the duplication of code in validity checks.\n\n* javax.cache.cache-api [optional*] - Supports caching timzeone definitions. * NOTE: when not included you must set\na value for the `net.fortuna.ical4j.timezone.cache.impl` configuration\n\n* commons-codec [optional] - Provides support for encoding and decoding binary data in text form. Used in `net.fortuna.ical4j.model.property.Attach`\n \n* groovy-all [optional] - The runtime for the Groovy language. Required for library enhancements such as iCalendar object construction using\nthe `net.fortuna.ical4j.model.ContentBuilder` DSL. This library is optional for all non-Groovy features of iCal4j.\n\n* bndlib [optional] - A tool for generating OSGi library metadata and packaging OSGi bundles. This library is not a runtime requirement, and\nis used only to generate version information in the javadoc API documentation.\n \n\n### Release Downloads\n\n* [mavenrepo]\n\n### Install with Maven\n\n### Install with Gradle\n\n\n## Usage\n\n### iCal4j 4.x (new Java Date/Time API)\n\nThe following table provides a comparison between the old and\nthe new date/time API for creating dates and date-based properties:\n\n| Description | New API | Old API |\n|-------------|---------|---------|\n| DTSTART with date value | `new DtStart\u003c\u003e(LocalDate.now())` | `new DtStart(new org.mnode.ical4j.model.Date())` |\n| DTSTART with date-time value | `new DtStart\u003c\u003e(ZoneDateTime.now())` | `new DtStart(new org.mnode.ical4j.model.DateTime())` |\n| DTSTART with specific timezone | `new DtStart\u003c\u003e(ZonedDateTime.now(tzReg.getTimeZone(\"Australia/Melbourne\").toZoneId()));` | `dtStart = new DtStart(new org.mnode.ical4j.model.DateTime()); dtStart.setTimeZone(tzReg.getTimeZone(\"Australia/Melbourne\"));` |\n| Parse a DATE-TIME string | `TemporalAdapter.parse(\"20130101T120000Z\")` | `new org.mnode.ical4j.model.DateTime(\"20130101T120000Z\")` |\n| Parse a DATE string | `TemporalAdapter.parse(\"20200229\")` | `new org.mnode.ical4j.model.Date(\"20200229\")` |\n\nYou may also find the [Java Legacy Date-Time Code] web page useful.\n \n### iCal4j 3.x (old Java Date API)\n\n### Examples\n\n\n## References\n\n* [RFC5545] - Internet Calendaring and Scheduling Core Object Specification (iCalendar)\n* [RFC5546] - iCalendar Transport-Independent Interoperability Protocol (iTIP)\n* [RFC6047] - iCalendar Message-Based Interoperability Protocol (iMIP)\n* [RFC6868] - Parameter Value Encoding in iCalendar and vCard\n* [RFC7953] - Calendar Availability\n* [RFC7808] - Time Zone Data Distribution Service\n* [RFC7986] - New Properties for iCalendar\n* [RFC7529] - Non-Gregorian Recurrence Rules in iCalendar\n* [RFC9073] - Event Publishing Extensions to iCalendar\n* [RFC9074] - \"VALARM\" Extensions for iCalendar\n* [RFC9253] - Support for iCalendar Relationships\n\n\n## Configuration\n\n    net.fortuna.ical4j.parser=net.fortuna.ical4j.data.HCalendarParserFactory\n\n    net.fortuna.ical4j.timezone.registry=net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory\n\n    net.fortuna.ical4j.timezone.update.enabled={true|false}\n\n    net.fortuna.ical4j.factory.decoder=net.fortuna.ical4j.util.DefaultDecoderFactory\n\n    net.fortuna.ical4j.factory.encoder=net.fortuna.ical4j.util.DefaultEncoderFactory\n\n    net.fortuna.ical4j.recur.maxincrementcount=1000\n    \n    net.fortuna.ical4j.timezone.cache.impl=net.fortuna.ical4j.util.MapTimeZoneCache\n\n\n### Compatibility Hints\n \n#### Relaxed Parsing\n    \n    ical4j.parsing.relaxed={true|false}\n\n iCal4j now has the capability to \"relax\" its parsing rules to enable parsing of\n *.ics files that don't properly conform to the iCalendar specification (RFC2445)\n \n This property is intended as a general relaxation of parsing rules to allow for parsing\n otherwise invalid calendar files. Initially enabling this property will allow for the\n creation of properties and components with illegal names (e.g. Mozilla Calendar's \"X\"\n property). Note that although this will allow for parsing calendars with illegal names,\n validation will still identify such names as an error in the calendar model.\n \n - You can relax iCal4j's unfolding rules by specifying the following system property:\n    \n        ical4j.unfolding.relaxed={true|false}\n \n Note that I believe this problem is not restricted to Mozilla calendaring\n products, but rather may be caused by UNIX/Linux-based applications relying on the\n default newline character (LF) to fold long lines (KOrganizer also seems to have this\n problem). This is, however, still incorrect as by definition long lines are folded\n using a (CRLF) combination.\n \n I've obtained a couple of samples of non-standard iCalendar files that I've included\n in the latest release (0.9.11). There is a Sunbird, phpicalendar, and a KOrganizer\n sample there (open them in Notepad on Windows to see what I mean).\n\n It seems that phpicalendar and KOrganizer always use LF instead of CRLF, and in\n addition KOrganizer seems to fold all property parameters and values (similar to\n Mozilla Calendar/Sunbird).\n\n Mozilla Calendar/Sunbird uses CRLF to fold all property parameter/values, however it\n uses just LF to fold long lines (i.e. longer than 75 characters).\n\n The latest release of iCal4j includes changes to UnfoldingReader that should work\n correctly with Mozilla Calendar/Sunbird, as long as the ical4j.unfolding.relaxed\n system property is set to true.\n\n KOrganizer/phpicalendar files should also work with the relaxed property, although\n because ALL lines are separated with just LF it also relies on the StreamTokenizer to\n correctly identify LF as a newline on Windows, and CRLF as a newline on UNIX/Linux. The\n API documentation for Java 1.5 says that it does do this, so if you still see problems\n with parsing it could be a bug in the Java implementation.\n\n \n The full set of system properties may be found in\n net.fortuna.ical4j.util.CompatibilityHints.\n\n\n#### iCal4j and Timezones\n\n##### iCal4j 4.x\n\niCal4j 4.x introduces support for the new Java Date/Time API. This is a major change to how\ndates are represented in iCal4j, as the following table outlines:\n\n| Description | iCal4j 4.x | iCal4j 3.x |\n|-------------|---------|---------|\n| 3.3.4.  Date | `TemporalAdapter\u003cLocalDate\u003e` | `org.mnode.ical4j.model.Date` |\n| **3.3.5.  Date-Time** |  | |\n| *FORM #1: DATE WITH LOCAL TIME* | `TemporalAdapter\u003cLocalDateTime\u003e` | `org.mnode.ical4j.model.DateTime` |\n| *FORM #2: DATE WITH UTC TIME* | `TemporalAdapter\u003cInstant\u003e` | `org.mnode.ical4j.model.DateTime` |\n| *FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE* | `TemporalAdapter\u003cZonedDateTime\u003e` | `org.mnode.ical4j.model.DateTime` |\n| 3.3.6.  Duration | `TemporalAmountAdapter` | `org.mnode.ical4j.model.Dur` |\n| 3.3.9.  Period of Time | `Period\u003cT extends Temporal\u003e` | `org.mnode.ical4j.model.Period` |\n| **3.3.12.  Time** | | | \n| *FORM #1 LOCAL TIME* | `TemporalAdapter\u003cLocalTime\u003e` | `org.mnode.ical4j.model.Time` | \n| *FORM #2: UTC TIME* | `TemporalAdapter\u003cInstant\u003e` | `org.mnode.ical4j.model.Time` | \n| *FORM #3: LOCAL TIME AND TIME ZONE REFERENCE* | `TemporalAdapter\u003cOffsetTime\u003e` | `org.mnode.ical4j.model.Time` | \n\n##### iCal4j 3.x\n\n    net.fortuna.ical4j.timezone.date.floating={true|false}\n\n Supporting timezones in an iCalendar implementation can be a complicated process,\n mostly due to the fact that there is not a definitive list of timezone definitions\n used by all iCalendar implementations. This means that an iCalendar file may be\n produced by one implementation and, if the file does not include all definitions\n for timezones relevant to the calendar properties, an alternate implementation\n may not know how to interpret the timezone identified in the calendar (or worse,\n it may interpret the timezone differently to the original implementation). All\n of these possibilities mean unpredictable behaviour which, to put it nicely, is\n not desireable.\n \n iCal4j approaches the problem of timezones in two ways: The first and by far the\n preferred approach is for iCalendar files to include definitions for all timezones\n referenced in the calendar object. To support this, when an existing calendar is\n parsed a list of VTimeZone definitions contained in the calendar is constructed.\n This list may then be queried whenever a VTimeZone definition is required.\n \n The second approach is to rely on a registry of VTimeZone definitions. iCal4j\n includes a default registry of timezone definitions (derived from the Olson timezone\n database - a defacto standard for timezone definitions), or you may also provide your\n own registry implementation from which to retreieve timezones. This approach is\n required when constructing new iCalendar files.\n \n Note that the intention of the iCal4j model is not to provide continuous validation\n feedback for every change in the model. For this reason you are free to change\n timezones on Time objects, remove or add TzId parameters, remove or add VTimeZone\n definitions, etc. without restriction. However when validation is run (automatically\n on output of the calendar) you will be notified if the changes are invalid.\n\n#### Validation\n    \n    ical4j.validation.relaxed={true|false}\n\n\n#### Micosoft Outlook compatibility\n    \n    ical4j.compatibility.outlook={true|false}\n\nBehaviour:\n\n* Enforces a folding length of 75 characters (by default ical4j will fold at 73 characters)\n* Allows for spaces when parsing a WEEKDAY list\n\nMicrosoft Outlook also appears to provide quoted TZID parameter values, as follows:\n \n    DTSTART;TZID=\"Pacific Time (US \u0026 Canada),Tijuana\":20041011T223000\n\n#### Lotus Notes compatibility\n\n    ical4j.compatibility.notes={true|false}\n\n## Development\n\n### Building with Gradle\n\niCal4j includes the Gradle wrapper for a simpler and more consistent build.\n\n**Run unit tests**\n\n    ./gradlew clean test\n\n**Build a new release**\n\n    ./gradlew clean test release -Prelease.forceVersion=2.0.0\n\n**Upload release binaries and packages**\n\n    RELEASE_VERSION=2.0.0 ./gradlew uploadArchives uploadDist\n\n### Redistribution\n\nIf you intend to use and distribute iCal4j in your own project please\nfollow these very simple guidelines:\n \n - Make a copy of the LICENSE, rename it to LICENSE.ical4j, and save\n it to the directory where you are re-distributing the iCal4j JAR.\n \n - I don't recommend extracting the iCal4j classes from its JAR and package\n in another JAR along with other classes. It may lead to version incompatibilites\n in the future. Rather I would suggest to include the ical4j.jar in your classpath\n as required.\n\n### Contributing\n\nOpen source software is made stronger by the community that supports it. Through participation you not only contribute to the quality of the software, but also gain a deeper insight into the inner workings.\n\nContributions may be in the form of feature enhancements, bug fixes, test cases, documentation and forum participation. If you have a question, just ask. If you have an answer, write it down.\n\nAnd if you are somehow constrained from participation, through corporate policy or otherwise, consider financial support. After all, if you are profiting from open source it's only fair to give something back to the community that make it all possible.\n","funding_links":["https://github.com/sponsors/benfortuna"],"categories":["Projects","项目"],"sub_categories":["Date and Time","日期和时间"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fical4j%2Fical4j","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fical4j%2Fical4j","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fical4j%2Fical4j/lists"}