{"id":28237,"date":"2017-11-21T15:42:24","date_gmt":"2017-11-21T13:42:24","guid":{"rendered":"https:\/\/mamchenkov.net\/wordpress\/?p=28237"},"modified":"2017-11-21T15:42:24","modified_gmt":"2017-11-21T13:42:24","slug":"rrule-will-make-you-hate-calendars","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2017\/11\/21\/rrule-will-make-you-hate-calendars\/","title":{"rendered":"RRULE will make you hate calendars"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p>Calendars are not the simplest applications by far.\u00a0 There are many different features, lots of different implementations, multitude of standards (just a few being <a href=\"https:\/\/tools.ietf.org\/html\/rfc2445\">RFC 2445<\/a>, which was obsoleted by <a href=\"https:\/\/tools.ietf.org\/html\/rfc5545\">RFC 5545<\/a>, which was updated by <a href=\"https:\/\/tools.ietf.org\/html\/rfc5546\">RFC 5546<\/a>, <a href=\"https:\/\/tools.ietf.org\/html\/rfc6868\">RFC 6868<\/a>, <a href=\"https:\/\/tools.ietf.org\/html\/rfc7529\">RFC 7529<\/a>, <a href=\"https:\/\/tools.ietf.org\/html\/rfc7953\">RFC 7953<\/a>, <a href=\"https:\/\/tools.ietf.org\/html\/rfc7986\">RFC 7986<\/a>) , and plenty of other complexities.<\/p>\n<p>One area in particular, which is cryptic and annoying is RRULE, or recurrence rule.\u00a0 You know, those events that don&#8217;t just happen once, but repeat once in a while.\u00a0 Starting with the most basic rules of repeating every day, and going into complete insanity of repeating every other Thursday, starting from next week and until the beginning of next year every other month, RRULEs can drive even the calmest of people completely insane.\u00a0 Here&#8217;s a screenshot to give you an idea.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"28238\" data-permalink=\"https:\/\/mamchenkov.net\/wordpress\/2017\/11\/21\/rrule-will-make-you-hate-calendars\/rrule\/\" data-orig-file=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?fit=1808%2C880&amp;ssl=1\" data-orig-size=\"1808,880\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"rrule\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?fit=660%2C321&amp;ssl=1\" class=\"aligncenter size-medium wp-image-28238\" src=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule-500x243.png?resize=500%2C243&#038;ssl=1\" alt=\"\" width=\"500\" height=\"243\" srcset=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?resize=500%2C243&amp;ssl=1 500w, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?resize=768%2C374&amp;ssl=1 768w, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?resize=1024%2C498&amp;ssl=1 1024w, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?w=1808&amp;ssl=1 1808w, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/rrule.png?w=1320 1320w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Here are a couple of tools that we found useful, when implementing and testing this functionality:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/jakubroztocil\/rrule\">rrule.js<\/a> &#8211; a JavaScript library for working with RRULEs.\u00a0 See the demo <a href=\"https:\/\/jakubroztocil.github.io\/rrule\/\">here<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/simshaun\/recurr\">recurr<\/a> &#8211; a PHP library for working with RRULEs.<\/li>\n<\/ul>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>Calendars are not the simplest applications by far.\u00a0 There are many different features, lots of different implementations, multitude of standards (just a few being RFC 2445, which was obsoleted by RFC 5545, which was updated by RFC 5546, RFC 6868, RFC 7529, RFC 7953, RFC 7986) , and plenty of other complexities. One area in &hellip; <a href=\"https:\/\/mamchenkov.net\/wordpress\/2017\/11\/21\/rrule-will-make-you-hate-calendars\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">RRULE will make you hate calendars<\/span><\/a><\/p>\n<!-- google_ad_section_end -->\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"RRULE will make you hate calendars #WebDev #PHP #JavaScript #calendar #standards","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_links_to":"","_links_to_target":""},"categories":[1,18,62,1334],"tags":[442,1139,38,1216,1330],"keyring_services":[],"class_list":["post-28237","post","type-post","status-publish","format-standard","hentry","category-general","category-programming","category-technology","category-web-work","tag-calendar","tag-javascript","tag-php","tag-standards","tag-web-development"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":22204,"url":"https:\/\/mamchenkov.net\/wordpress\/2014\/07\/16\/http1-1-just-got-a-major-update\/","url_meta":{"origin":28237,"position":0},"title":"HTTP\/1.1 just got a major update","author":"Leonid Mamchenkov","date":"July 16, 2014","format":"link","excerpt":"HTTP\/1.1 just got a major update - somehow I missed this last month. The IETF just published several new RFCs that update HTTP\/1.1: RFC 7230: Message Syntax and Routing RFC 7231: Semantics and Content RFC 7232: Conditional Requests RFC 7233: Range Request RFC 7234: Caching RFC 7235: Authentication RFC 7236:\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":27542,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/04\/29\/rfc-http-299-disappointed\/","url_meta":{"origin":28237,"position":1},"title":"RFC : HTTP 299 Disappointed","author":"Leonid Mamchenkov","date":"April 29, 2017","format":false,"excerpt":"https:\/\/twitter.com\/acathrow\/status\/857705132913561600 This is ... funny.","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":16273,"url":"https:\/\/mamchenkov.net\/wordpress\/2012\/05\/07\/rfc-6585-additional-http-status-codes\/","url_meta":{"origin":28237,"position":2},"title":"RFC 6585 &#8211; Additional HTTP Status Codes","author":"Leonid Mamchenkov","date":"May 7, 2012","format":false,"excerpt":"If you've missed it like I did, RFC 6885 has been published recently. \u00a0It introduces four additional status codes for the HTTP protocol. \u00a0The codes are: 428 Precondition Required 429 Too Many Requests 431 Request Header Fields Too Large 511 Network Authentication Required Here is a blog post that gives\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11191,"url":"https:\/\/mamchenkov.net\/wordpress\/2008\/05\/06\/rfc-1855-netiquette-guidelines\/","url_meta":{"origin":28237,"position":3},"title":"RFC 1855 : Netiquette guidelines","author":"Leonid Mamchenkov","date":"May 6, 2008","format":false,"excerpt":"More and more people spend more and more time online. I wish more and more of them read RFC 1855 which covers netiquette guidelines. This document is more than 10 years old, but most of the points that it discusses are as valid today as they were back then. Some\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":8295,"url":"https:\/\/mamchenkov.net\/wordpress\/2004\/12\/05\/rfc-3875-the-common-gateway-interface-cgi-version-11\/","url_meta":{"origin":28237,"position":4},"title":"RFC 3875 &#8211; The Common Gateway Interface (CGI) Version 1.1","author":"Leonid Mamchenkov","date":"December 5, 2004","format":false,"excerpt":"It seems that until very recently (October 2004) there was no RFC covering CGI. Now there is - RFC 3875 - The Common Gateway Interface (CGI) Version 1.1. It explains how CGI scripts should be called and executed, what they should be given and what they should return. There is\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":29027,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/11\/25\/crell-apiproblem-a-simple-implementation-of-the-api-problem-specification\/","url_meta":{"origin":28237,"position":5},"title":"Crell\/ApiProblem &#8211; a simple implementation of the api-problem specification","author":"Leonid Mamchenkov","date":"November 25, 2018","format":false,"excerpt":"I've been working with REST\/RESTful APIs for a while now.\u00a0 They are usually a lot better than the SOAP or XML-RPC stuff we had before.\u00a0 But they are also not perfect.\u00a0 Error handling and reporting is a common area between many implementations that needs more attention and consistency.\u00a0 Turns out,\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/28237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/comments?post=28237"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/28237\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=28237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=28237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=28237"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=28237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}