CINXE.COM
Module:Date - Simple English Wikipedia, the free encyclopedia
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Module:Date - Simple English Wikipedia, the free encyclopedia</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )simplewikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat": "dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"0cd4a972-bc65-4288-9bf7-60c39e92466a","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"Module:Date","wgTitle":"Date","wgCurRevisionId":8554926,"wgRevisionId":8554926,"wgArticleId":609635,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"Scribunto","wgRelevantPageName":"Module:Date","wgRelevantArticleId":609635,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":["sysop"],"wgRestrictionMove":["sysop"],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"en", "pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":true,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":50000,"wgRelatedArticlesCompat":[],"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q19963557","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","skins.vector.search.codex.styles":"ready", "skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.ReferenceTooltips","ext.gadget.refToolbar","ext.gadget.switcher","ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.cx.eventlogging.campaigns","wikibase.client.vector-2022","ext.checkUser.clientHints","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.5"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Module:Date - Simple English Wikipedia, the free encyclopedia"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//simple.m.wikipedia.org/wiki/Module:Date"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (en)"> <link rel="EditURI" type="application/rsd+xml" href="//simple.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://simple.wikipedia.org/wiki/Module:Date"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.simple"> <link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-828 ns-subject page-Module_Date rootpage-Module_Date skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Getting around </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedia:Simple_start" title="About the project, what you can do, where to find things"><span>Simple start</span></a></li><li id="n-Simple-talk" class="mw-list-item"><a href="/wiki/Wikipedia:Simple_talk"><span>Simple talk</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="The list of new changes in the wiki. [r]" accesskey="r"><span>New changes</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Show any page [x]" accesskey="x"><span>Show any page</span></a></li><li id="n-help" class="mw-list-item"><a href="/wiki/Help:Contents" title="The place to get help"><span>Help</span></a></li><li id="n-contactpage" class="mw-list-item"><a href="//simple.wikipedia.org/wiki/Wikipedia:Contact_us"><span>Contact us</span></a></li><li id="n-aboutsite" class="mw-list-item"><a href="/wiki/Wikipedia:About"><span>About Wikipedia</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedia" src="/static/images/mobile/copyright/wikipedia-wordmark-en.svg" style="width: 7.5em; height: 1.125em;"> <img class="mw-logo-tagline" alt="The Free Encyclopedia" src="/static/images/mobile/copyright/wikipedia-tagline-simple.svg" width="101" height="18" style="width: 6.3125em; height: 1.125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Wikipedia [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Wikipedia" aria-label="Search Wikipedia" autocapitalize="sentences" title="Search Wikipedia [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_simple.wikipedia.org&uselang=en" class=""><span>Give to Wikipedia</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Module%3ADate" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Module%3ADate" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_simple.wikipedia.org&uselang=en"><span>Give to Wikipedia</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Module%3ADate" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Module%3ADate" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about changes from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-Formatted_output" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Formatted_output"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Formatted output</span> </div> </a> <ul id="toc-Formatted_output-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Julian_date" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Julian_date"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Julian date</span> </div> </a> <ul id="toc-Julian_date-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Date_differences" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Date_differences"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Date differences</span> </div> </a> <ul id="toc-Date_differences-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-namespace">Module</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">Date</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Go to an article in another language. Available in 118 languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-118" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">118 languages</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-smn mw-list-item"><a href="https://smn.wikipedia.org/wiki/Mooduul:Fr:Date" title="Mooduul:Fr:Date – Inari Sami" lang="smn" hreflang="smn" data-title="Mooduul:Fr:Date" data-language-autonym="Anarâškielâ" data-language-local-name="Inari Sami" class="interlanguage-link-target"><span>Anarâškielâ</span></a></li><li class="interlanguage-link interwiki-anp mw-list-item"><a href="https://anp.wikipedia.org/wiki/%E0%A4%AE%E0%A5%8B%E0%A4%A1%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%B2:Date" title="मोड्यूल:Date – Angika" lang="anp" hreflang="anp" data-title="मोड्यूल:Date" data-language-autonym="अंगिका" data-language-local-name="Angika" class="interlanguage-link-target"><span>अंगिका</span></a></li><li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wikipedia.org/wiki/%D9%88%D8%AD%D8%AF%D8%A9:Date" title="وحدة:Date – Arabic" lang="ar" hreflang="ar" data-title="وحدة:Date" data-language-autonym="العربية" data-language-local-name="Arabic" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-frp mw-list-item"><a href="https://frp.wikipedia.org/wiki/Module:D%C3%A2ta" title="Module:Dâta – Arpitan" lang="frp" hreflang="frp" data-title="Module:Dâta" data-language-autonym="Arpetan" data-language-local-name="Arpitan" class="interlanguage-link-target"><span>Arpetan</span></a></li><li class="interlanguage-link interwiki-as mw-list-item"><a href="https://as.wikipedia.org/wiki/Module:Date" title="Module:Date – Assamese" lang="as" hreflang="as" data-title="Module:Date" data-language-autonym="অসমীয়া" data-language-local-name="Assamese" class="interlanguage-link-target"><span>অসমীয়া</span></a></li><li class="interlanguage-link interwiki-az mw-list-item"><a href="https://az.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Azerbaijani" lang="az" hreflang="az" data-title="Modul:Date" data-language-autonym="Azərbaycanca" data-language-local-name="Azerbaijani" class="interlanguage-link-target"><span>Azərbaycanca</span></a></li><li class="interlanguage-link interwiki-azb mw-list-item"><a href="https://azb.wikipedia.org/wiki/%D9%85%D8%A7%DA%98%D9%88%D9%84:Date" title="ماژول:Date – South Azerbaijani" lang="azb" hreflang="azb" data-title="ماژول:Date" data-language-autonym="تۆرکجه" data-language-local-name="South Azerbaijani" class="interlanguage-link-target"><span>تۆرکجه</span></a></li><li class="interlanguage-link interwiki-ban mw-list-item"><a href="https://ban.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Balinese" lang="ban" hreflang="ban" data-title="Modul:Date" data-language-autonym="Basa Bali" data-language-local-name="Balinese" class="interlanguage-link-target"><span>Basa Bali</span></a></li><li class="interlanguage-link interwiki-bn mw-list-item"><a href="https://bn.wikipedia.org/wiki/%E0%A6%AE%E0%A6%A1%E0%A6%BF%E0%A6%89%E0%A6%B2:%E0%A6%A4%E0%A6%BE%E0%A6%B0%E0%A6%BF%E0%A6%96" title="মডিউল:তারিখ – Bangla" lang="bn" hreflang="bn" data-title="মডিউল:তারিখ" data-language-autonym="বাংলা" data-language-local-name="Bangla" class="interlanguage-link-target"><span>বাংলা</span></a></li><li class="interlanguage-link interwiki-zh-min-nan mw-list-item"><a href="https://zh-min-nan.wikipedia.org/wiki/%E6%A8%A1%E7%B5%84:Date" title="模組:Date – Minnan" lang="nan" hreflang="nan" data-title="模組:Date" data-language-autonym="閩南語 / Bân-lâm-gú" data-language-local-name="Minnan" class="interlanguage-link-target"><span>閩南語 / Bân-lâm-gú</span></a></li><li class="interlanguage-link interwiki-be mw-list-item"><a href="https://be.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%94%D0%B0%D1%82%D0%B0" title="Модуль:Дата – Belarusian" lang="be" hreflang="be" data-title="Модуль:Дата" data-language-autonym="Беларуская" data-language-local-name="Belarusian" class="interlanguage-link-target"><span>Беларуская</span></a></li><li class="interlanguage-link interwiki-be-x-old mw-list-item"><a href="https://be-tarask.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%94%D0%B0%D1%82%D0%B0" title="Модуль:Дата – Belarusian (Taraškievica orthography)" lang="be-tarask" hreflang="be-tarask" data-title="Модуль:Дата" data-language-autonym="Беларуская (тарашкевіца)" data-language-local-name="Belarusian (Taraškievica orthography)" class="interlanguage-link-target"><span>Беларуская (тарашкевіца)</span></a></li><li class="interlanguage-link interwiki-bh mw-list-item"><a href="https://bh.wikipedia.org/wiki/Module:Date" title="Module:Date – Bhojpuri" lang="bh" hreflang="bh" data-title="Module:Date" data-language-autonym="भोजपुरी" data-language-local-name="Bhojpuri" class="interlanguage-link-target"><span>भोजपुरी</span></a></li><li class="interlanguage-link interwiki-bcl mw-list-item"><a href="https://bcl.wikipedia.org/wiki/Module:Date" title="Module:Date – Central Bikol" lang="bcl" hreflang="bcl" data-title="Module:Date" data-language-autonym="Bikol Central" data-language-local-name="Central Bikol" class="interlanguage-link-target"><span>Bikol Central</span></a></li><li class="interlanguage-link interwiki-bg mw-list-item"><a href="https://bg.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:Date" title="Модул:Date – Bulgarian" lang="bg" hreflang="bg" data-title="Модул:Date" data-language-autonym="Български" data-language-local-name="Bulgarian" class="interlanguage-link-target"><span>Български</span></a></li><li class="interlanguage-link interwiki-bs mw-list-item"><a href="https://bs.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Bosnian" lang="bs" hreflang="bs" data-title="Modul:Date" data-language-autonym="Bosanski" data-language-local-name="Bosnian" class="interlanguage-link-target"><span>Bosanski</span></a></li><li class="interlanguage-link interwiki-bxr mw-list-item"><a href="https://bxr.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Date" title="Модуль:Date – Russia Buriat" lang="bxr" hreflang="bxr" data-title="Модуль:Date" data-language-autonym="Буряад" data-language-local-name="Russia Buriat" class="interlanguage-link-target"><span>Буряад</span></a></li><li class="interlanguage-link interwiki-ceb mw-list-item"><a href="https://ceb.wikipedia.org/wiki/Module:Date" title="Module:Date – Cebuano" lang="ceb" hreflang="ceb" data-title="Module:Date" data-language-autonym="Cebuano" data-language-local-name="Cebuano" class="interlanguage-link-target"><span>Cebuano</span></a></li><li class="interlanguage-link interwiki-co mw-list-item"><a href="https://co.wikipedia.org/wiki/Modulo:Date" title="Modulo:Date – Corsican" lang="co" hreflang="co" data-title="Modulo:Date" data-language-autonym="Corsu" data-language-local-name="Corsican" class="interlanguage-link-target"><span>Corsu</span></a></li><li class="interlanguage-link interwiki-cy mw-list-item"><a href="https://cy.wikipedia.org/wiki/Modiwl:Date" title="Modiwl:Date – Welsh" lang="cy" hreflang="cy" data-title="Modiwl:Date" data-language-autonym="Cymraeg" data-language-local-name="Welsh" class="interlanguage-link-target"><span>Cymraeg</span></a></li><li class="interlanguage-link interwiki-da mw-list-item"><a href="https://da.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Danish" lang="da" hreflang="da" data-title="Modul:Date" data-language-autonym="Dansk" data-language-local-name="Danish" class="interlanguage-link-target"><span>Dansk</span></a></li><li class="interlanguage-link interwiki-ary mw-list-item"><a href="https://ary.wikipedia.org/wiki/%D9%85%D9%88%D8%AF%D9%88%D9%84:Date" title="مودول:Date – Moroccan Arabic" lang="ary" hreflang="ary" data-title="مودول:Date" data-language-autonym="الدارجة" data-language-local-name="Moroccan Arabic" class="interlanguage-link-target"><span>الدارجة</span></a></li><li class="interlanguage-link interwiki-et mw-list-item"><a href="https://et.wikipedia.org/wiki/Moodul:Date" title="Moodul:Date – Estonian" lang="et" hreflang="et" data-title="Moodul:Date" data-language-autonym="Eesti" data-language-local-name="Estonian" class="interlanguage-link-target"><span>Eesti</span></a></li><li class="interlanguage-link interwiki-el mw-list-item"><a href="https://el.wikipedia.org/wiki/Module:Date" title="Module:Date – Greek" lang="el" hreflang="el" data-title="Module:Date" data-language-autonym="Ελληνικά" data-language-local-name="Greek" class="interlanguage-link-target"><span>Ελληνικά</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wikipedia.org/wiki/Module:Date" title="Module:Date – English" lang="en" hreflang="en" data-title="Module:Date" data-language-autonym="English" data-language-local-name="English" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wikipedia.org/wiki/M%C3%B3dulo:Date" title="Módulo:Date – Spanish" lang="es" hreflang="es" data-title="Módulo:Date" data-language-autonym="Español" data-language-local-name="Spanish" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-eo mw-list-item"><a href="https://eo.wikipedia.org/wiki/Modulo:Date" title="Modulo:Date – Esperanto" lang="eo" hreflang="eo" data-title="Modulo:Date" data-language-autonym="Esperanto" data-language-local-name="Esperanto" class="interlanguage-link-target"><span>Esperanto</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Date" title="پودمان:Date – Persian" lang="fa" hreflang="fa" data-title="پودمان:Date" data-language-autonym="فارسی" data-language-local-name="Persian" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/Module:Date" title="Module:Date – French" lang="fr" hreflang="fr" data-title="Module:Date" data-language-autonym="Français" data-language-local-name="French" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-ga mw-list-item"><a href="https://ga.wikipedia.org/wiki/Module:Date" title="Module:Date – Irish" lang="ga" hreflang="ga" data-title="Module:Date" data-language-autonym="Gaeilge" data-language-local-name="Irish" class="interlanguage-link-target"><span>Gaeilge</span></a></li><li class="interlanguage-link interwiki-gu mw-list-item"><a href="https://gu.wikipedia.org/wiki/%E0%AA%B5%E0%AA%BF%E0%AA%AD%E0%AA%BE%E0%AA%97:Date" title="વિભાગ:Date – Gujarati" lang="gu" hreflang="gu" data-title="વિભાગ:Date" data-language-autonym="ગુજરાતી" data-language-local-name="Gujarati" class="interlanguage-link-target"><span>ગુજરાતી</span></a></li><li class="interlanguage-link interwiki-gom mw-list-item"><a href="https://gom.wikipedia.org/wiki/%E0%A4%8F%E0%A4%95%E0%A4%95:Date" title="एकक:Date – Goan Konkani" lang="gom" hreflang="gom" data-title="एकक:Date" data-language-autonym="गोंयची कोंकणी / Gõychi Konknni" data-language-local-name="Goan Konkani" class="interlanguage-link-target"><span>गोंयची कोंकणी / Gõychi Konknni</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%93%88:Date" title="모듈:Date – Korean" lang="ko" hreflang="ko" data-title="모듈:Date" data-language-autonym="한국어" data-language-local-name="Korean" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-ha mw-list-item"><a href="https://ha.wikipedia.org/wiki/Module:Date" title="Module:Date – Hausa" lang="ha" hreflang="ha" data-title="Module:Date" data-language-autonym="Hausa" data-language-local-name="Hausa" class="interlanguage-link-target"><span>Hausa</span></a></li><li class="interlanguage-link interwiki-hy mw-list-item"><a href="https://hy.wikipedia.org/wiki/%D5%84%D5%B8%D5%A4%D5%B8%D6%82%D5%AC:Date" title="Մոդուլ:Date – Armenian" lang="hy" hreflang="hy" data-title="Մոդուլ:Date" data-language-autonym="Հայերեն" data-language-local-name="Armenian" class="interlanguage-link-target"><span>Հայերեն</span></a></li><li class="interlanguage-link interwiki-hi mw-list-item"><a href="https://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%89%E0%A4%A1%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%B2:Date" title="मॉड्यूल:Date – Hindi" lang="hi" hreflang="hi" data-title="मॉड्यूल:Date" data-language-autonym="हिन्दी" data-language-local-name="Hindi" class="interlanguage-link-target"><span>हिन्दी</span></a></li><li class="interlanguage-link interwiki-hr mw-list-item"><a href="https://hr.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Croatian" lang="hr" hreflang="hr" data-title="Modul:Date" data-language-autonym="Hrvatski" data-language-local-name="Croatian" class="interlanguage-link-target"><span>Hrvatski</span></a></li><li class="interlanguage-link interwiki-gor mw-list-item"><a href="https://gor.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Gorontalo" lang="gor" hreflang="gor" data-title="Modul:Date" data-language-autonym="Bahasa Hulontalo" data-language-local-name="Gorontalo" class="interlanguage-link-target"><span>Bahasa Hulontalo</span></a></li><li class="interlanguage-link interwiki-ilo mw-list-item"><a href="https://ilo.wikipedia.org/wiki/Modulo:Date" title="Modulo:Date – Iloko" lang="ilo" hreflang="ilo" data-title="Modulo:Date" data-language-autonym="Ilokano" data-language-local-name="Iloko" class="interlanguage-link-target"><span>Ilokano</span></a></li><li class="interlanguage-link interwiki-id mw-list-item"><a href="https://id.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Indonesian" lang="id" hreflang="id" data-title="Modul:Date" data-language-autonym="Bahasa Indonesia" data-language-local-name="Indonesian" class="interlanguage-link-target"><span>Bahasa Indonesia</span></a></li><li class="interlanguage-link interwiki-is mw-list-item"><a href="https://is.wikipedia.org/wiki/Module:Date" title="Module:Date – Icelandic" lang="is" hreflang="is" data-title="Module:Date" data-language-autonym="Íslenska" data-language-local-name="Icelandic" class="interlanguage-link-target"><span>Íslenska</span></a></li><li class="interlanguage-link interwiki-he mw-list-item"><a href="https://he.wikipedia.org/wiki/%D7%99%D7%97%D7%99%D7%93%D7%94:%D7%AA%D7%90%D7%A8%D7%99%D7%9A" title="יחידה:תאריך – Hebrew" lang="he" hreflang="he" data-title="יחידה:תאריך" data-language-autonym="עברית" data-language-local-name="Hebrew" class="interlanguage-link-target"><span>עברית</span></a></li><li class="interlanguage-link interwiki-jv mw-list-item"><a href="https://jv.wikipedia.org/wiki/Modhul:Date" title="Modhul:Date – Javanese" lang="jv" hreflang="jv" data-title="Modhul:Date" data-language-autonym="Jawa" data-language-local-name="Javanese" class="interlanguage-link-target"><span>Jawa</span></a></li><li class="interlanguage-link interwiki-kbp mw-list-item"><a href="https://kbp.wikipedia.org/wiki/Module:Date" title="Module:Date – Kabiye" lang="kbp" hreflang="kbp" data-title="Module:Date" data-language-autonym="Kabɩyɛ" data-language-local-name="Kabiye" class="interlanguage-link-target"><span>Kabɩyɛ</span></a></li><li class="interlanguage-link interwiki-kn mw-list-item"><a href="https://kn.wikipedia.org/wiki/%E0%B2%AE%E0%B2%BE%E0%B2%A1%E0%B3%8D%E0%B2%AF%E0%B3%82%E0%B2%B2%E0%B3%8D:Date" title="ಮಾಡ್ಯೂಲ್:Date – Kannada" lang="kn" hreflang="kn" data-title="ಮಾಡ್ಯೂಲ್:Date" data-language-autonym="ಕನ್ನಡ" data-language-local-name="Kannada" class="interlanguage-link-target"><span>ಕನ್ನಡ</span></a></li><li class="interlanguage-link interwiki-ka mw-list-item"><a href="https://ka.wikipedia.org/wiki/%E1%83%9B%E1%83%9D%E1%83%93%E1%83%A3%E1%83%9A%E1%83%98:Date" title="მოდული:Date – Georgian" lang="ka" hreflang="ka" data-title="მოდული:Date" data-language-autonym="ქართული" data-language-local-name="Georgian" class="interlanguage-link-target"><span>ქართული</span></a></li><li class="interlanguage-link interwiki-kk mw-list-item"><a href="https://kk.wikipedia.org/wiki/Module:Date" title="Module:Date – Kazakh" lang="kk" hreflang="kk" data-title="Module:Date" data-language-autonym="Қазақша" data-language-local-name="Kazakh" class="interlanguage-link-target"><span>Қазақша</span></a></li><li class="interlanguage-link interwiki-rw mw-list-item"><a href="https://rw.wikipedia.org/wiki/Module:Date" title="Module:Date – Kinyarwanda" lang="rw" hreflang="rw" data-title="Module:Date" data-language-autonym="Ikinyarwanda" data-language-local-name="Kinyarwanda" class="interlanguage-link-target"><span>Ikinyarwanda</span></a></li><li class="interlanguage-link interwiki-ht mw-list-item"><a href="https://ht.wikipedia.org/wiki/Module:Date" title="Module:Date – Haitian Creole" lang="ht" hreflang="ht" data-title="Module:Date" data-language-autonym="Kreyòl ayisyen" data-language-local-name="Haitian Creole" class="interlanguage-link-target"><span>Kreyòl ayisyen</span></a></li><li class="interlanguage-link interwiki-ku mw-list-item"><a href="https://ku.wikipedia.org/wiki/Modul:Dem" title="Modul:Dem – Kurdish" lang="ku" hreflang="ku" data-title="Modul:Dem" data-language-autonym="Kurdî" data-language-local-name="Kurdish" class="interlanguage-link-target"><span>Kurdî</span></a></li><li class="interlanguage-link interwiki-lo mw-list-item"><a href="https://lo.wikipedia.org/wiki/Module:Date" title="Module:Date – Lao" lang="lo" hreflang="lo" data-title="Module:Date" data-language-autonym="ລາວ" data-language-local-name="Lao" class="interlanguage-link-target"><span>ລາວ</span></a></li><li class="interlanguage-link interwiki-lv mw-list-item"><a href="https://lv.wikipedia.org/wiki/Modulis:Datums" title="Modulis:Datums – Latvian" lang="lv" hreflang="lv" data-title="Modulis:Datums" data-language-autonym="Latviešu" data-language-local-name="Latvian" class="interlanguage-link-target"><span>Latviešu</span></a></li><li class="interlanguage-link interwiki-lb mw-list-item"><a href="https://lb.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Luxembourgish" lang="lb" hreflang="lb" data-title="Modul:Date" data-language-autonym="Lëtzebuergesch" data-language-local-name="Luxembourgish" class="interlanguage-link-target"><span>Lëtzebuergesch</span></a></li><li class="interlanguage-link interwiki-lt mw-list-item"><a href="https://lt.wikipedia.org/wiki/Module:Date" title="Module:Date – Lithuanian" lang="lt" hreflang="lt" data-title="Module:Date" data-language-autonym="Lietuvių" data-language-local-name="Lithuanian" class="interlanguage-link-target"><span>Lietuvių</span></a></li><li class="interlanguage-link interwiki-hu mw-list-item"><a href="https://hu.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Hungarian" lang="hu" hreflang="hu" data-title="Modul:Date" data-language-autonym="Magyar" data-language-local-name="Hungarian" class="interlanguage-link-target"><span>Magyar</span></a></li><li class="interlanguage-link interwiki-mai mw-list-item"><a href="https://mai.wikipedia.org/wiki/%E0%A4%AE%E0%A5%8B%E0%A4%A1%E0%A5%8D%E0%A4%AF%E0%A5%81%E0%A4%B2:Date" title="मोड्युल:Date – Maithili" lang="mai" hreflang="mai" data-title="मोड्युल:Date" data-language-autonym="मैथिली" data-language-local-name="Maithili" class="interlanguage-link-target"><span>मैथिली</span></a></li><li class="interlanguage-link interwiki-mk mw-list-item"><a href="https://mk.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:Date" title="Модул:Date – Macedonian" lang="mk" hreflang="mk" data-title="Модул:Date" data-language-autonym="Македонски" data-language-local-name="Macedonian" class="interlanguage-link-target"><span>Македонски</span></a></li><li class="interlanguage-link interwiki-mg mw-list-item"><a href="https://mg.wikipedia.org/wiki/Module:Date" title="Module:Date – Malagasy" lang="mg" hreflang="mg" data-title="Module:Date" data-language-autonym="Malagasy" data-language-local-name="Malagasy" class="interlanguage-link-target"><span>Malagasy</span></a></li><li class="interlanguage-link interwiki-ml mw-list-item"><a href="https://ml.wikipedia.org/wiki/%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Date" title="ഘടകം:Date – Malayalam" lang="ml" hreflang="ml" data-title="ഘടകം:Date" data-language-autonym="മലയാളം" data-language-local-name="Malayalam" class="interlanguage-link-target"><span>മലയാളം</span></a></li><li class="interlanguage-link interwiki-mi mw-list-item"><a href="https://mi.wikipedia.org/wiki/Module:Date" title="Module:Date – Māori" lang="mi" hreflang="mi" data-title="Module:Date" data-language-autonym="Māori" data-language-local-name="Māori" class="interlanguage-link-target"><span>Māori</span></a></li><li class="interlanguage-link interwiki-mr mw-list-item"><a href="https://mr.wikipedia.org/wiki/%E0%A4%B5%E0%A4%BF%E0%A4%AD%E0%A4%BE%E0%A4%97:Date" title="विभाग:Date – Marathi" lang="mr" hreflang="mr" data-title="विभाग:Date" data-language-autonym="मराठी" data-language-local-name="Marathi" class="interlanguage-link-target"><span>मराठी</span></a></li><li class="interlanguage-link interwiki-xmf mw-list-item"><a href="https://xmf.wikipedia.org/wiki/%E1%83%9B%E1%83%9D%E1%83%93%E1%83%A3%E1%83%9A%E1%83%98:Date" title="მოდული:Date – Mingrelian" lang="xmf" hreflang="xmf" data-title="მოდული:Date" data-language-autonym="მარგალური" data-language-local-name="Mingrelian" class="interlanguage-link-target"><span>მარგალური</span></a></li><li class="interlanguage-link interwiki-mnw mw-list-item"><a href="https://mnw.wikipedia.org/wiki/%E1%80%99%E1%80%9D%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0:Date" title="မဝ်ဂျူ:Date – Mon" lang="mnw" hreflang="mnw" data-title="မဝ်ဂျူ:Date" data-language-autonym="ဘာသာမန်" data-language-local-name="Mon" class="interlanguage-link-target"><span>ဘာသာမန်</span></a></li><li class="interlanguage-link interwiki-mzn mw-list-item"><a href="https://mzn.wikipedia.org/wiki/%D9%85%D8%A7%DA%98%D9%88%D9%84:Date" title="ماژول:Date – Mazanderani" lang="mzn" hreflang="mzn" data-title="ماژول:Date" data-language-autonym="مازِرونی" data-language-local-name="Mazanderani" class="interlanguage-link-target"><span>مازِرونی</span></a></li><li class="interlanguage-link interwiki-ms mw-list-item"><a href="https://ms.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Malay" lang="ms" hreflang="ms" data-title="Modul:Date" data-language-autonym="Bahasa Melayu" data-language-local-name="Malay" class="interlanguage-link-target"><span>Bahasa Melayu</span></a></li><li class="interlanguage-link interwiki-fat mw-list-item"><a href="https://fat.wikipedia.org/wiki/Module:Date" title="Module:Date – Fanti" lang="fat" hreflang="fat" data-title="Module:Date" data-language-autonym="Mfantse" data-language-local-name="Fanti" class="interlanguage-link-target"><span>Mfantse</span></a></li><li class="interlanguage-link interwiki-mn mw-list-item"><a href="https://mn.wikipedia.org/wiki/Module:Date" title="Module:Date – Mongolian" lang="mn" hreflang="mn" data-title="Module:Date" data-language-autonym="Монгол" data-language-local-name="Mongolian" class="interlanguage-link-target"><span>Монгол</span></a></li><li class="interlanguage-link interwiki-my mw-list-item"><a href="https://my.wikipedia.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:Date" title="မော်ဂျူး:Date – Burmese" lang="my" hreflang="my" data-title="မော်ဂျူး:Date" data-language-autonym="မြန်မာဘာသာ" data-language-local-name="Burmese" class="interlanguage-link-target"><span>မြန်မာဘာသာ</span></a></li><li class="interlanguage-link interwiki-ne mw-list-item"><a href="https://ne.wikipedia.org/wiki/%E0%A4%AE%E0%A5%8B%E0%A4%A1%E0%A5%8D%E0%A4%AF%E0%A5%81%E0%A4%B2:Date" title="मोड्युल:Date – Nepali" lang="ne" hreflang="ne" data-title="मोड्युल:Date" data-language-autonym="नेपाली" data-language-local-name="Nepali" class="interlanguage-link-target"><span>नेपाली</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Date" title="モジュール:Date – Japanese" lang="ja" hreflang="ja" data-title="モジュール:Date" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-no mw-list-item"><a href="https://no.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Norwegian Bokmål" lang="nb" hreflang="nb" data-title="Modul:Date" data-language-autonym="Norsk bokmål" data-language-local-name="Norwegian Bokmål" class="interlanguage-link-target"><span>Norsk bokmål</span></a></li><li class="interlanguage-link interwiki-nn mw-list-item"><a href="https://nn.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Norwegian Nynorsk" lang="nn" hreflang="nn" data-title="Modul:Date" data-language-autonym="Norsk nynorsk" data-language-local-name="Norwegian Nynorsk" class="interlanguage-link-target"><span>Norsk nynorsk</span></a></li><li class="interlanguage-link interwiki-or mw-list-item"><a href="https://or.wikipedia.org/wiki/%E0%AC%AE%E0%AC%A1%E0%AD%8D%E0%AD%9F%E0%AD%81%E0%AC%B2:Date" title="ମଡ୍ୟୁଲ:Date – Odia" lang="or" hreflang="or" data-title="ମଡ୍ୟୁଲ:Date" data-language-autonym="ଓଡ଼ିଆ" data-language-local-name="Odia" class="interlanguage-link-target"><span>ଓଡ଼ିଆ</span></a></li><li class="interlanguage-link interwiki-uz mw-list-item"><a href="https://uz.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Uzbek" lang="uz" hreflang="uz" data-title="Modul:Date" data-language-autonym="Oʻzbekcha / ўзбекча" data-language-local-name="Uzbek" class="interlanguage-link-target"><span>Oʻzbekcha / ўзбекча</span></a></li><li class="interlanguage-link interwiki-pa mw-list-item"><a href="https://pa.wikipedia.org/wiki/%E0%A8%AE%E0%A9%8C%E0%A8%A1%E0%A8%BF%E0%A8%8A%E0%A8%B2:Date" title="ਮੌਡਿਊਲ:Date – Punjabi" lang="pa" hreflang="pa" data-title="ਮੌਡਿਊਲ:Date" data-language-autonym="ਪੰਜਾਬੀ" data-language-local-name="Punjabi" class="interlanguage-link-target"><span>ਪੰਜਾਬੀ</span></a></li><li class="interlanguage-link interwiki-blk mw-list-item"><a href="https://blk.wikipedia.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:Date" title="မော်ဂျူး:Date – Pa'O" lang="blk" hreflang="blk" data-title="မော်ဂျူး:Date" data-language-autonym="ပအိုဝ်ႏဘာႏသာႏ" data-language-local-name="Pa'O" class="interlanguage-link-target"><span>ပအိုဝ်ႏဘာႏသာႏ</span></a></li><li class="interlanguage-link interwiki-pap mw-list-item"><a href="https://pap.wikipedia.org/wiki/Module:Date" title="Module:Date – Papiamento" lang="pap" hreflang="pap" data-title="Module:Date" data-language-autonym="Papiamentu" data-language-local-name="Papiamento" class="interlanguage-link-target"><span>Papiamentu</span></a></li><li class="interlanguage-link interwiki-ps mw-list-item"><a href="https://ps.wikipedia.org/wiki/Module:Date" title="Module:Date – Pashto" lang="ps" hreflang="ps" data-title="Module:Date" data-language-autonym="پښتو" data-language-local-name="Pashto" class="interlanguage-link-target"><span>پښتو</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wikipedia.org/wiki/M%C3%B3dulo:Data" title="Módulo:Data – Portuguese" lang="pt" hreflang="pt" data-title="Módulo:Data" data-language-autonym="Português" data-language-local-name="Portuguese" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-ro mw-list-item"><a href="https://ro.wikipedia.org/wiki/Modul:DateUtils" title="Modul:DateUtils – Romanian" lang="ro" hreflang="ro" data-title="Modul:DateUtils" data-language-autonym="Română" data-language-local-name="Romanian" class="interlanguage-link-target"><span>Română</span></a></li><li class="interlanguage-link interwiki-rue mw-list-item"><a href="https://rue.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Date" title="Модуль:Date – Rusyn" lang="rue" hreflang="rue" data-title="Модуль:Date" data-language-autonym="Русиньскый" data-language-local-name="Rusyn" class="interlanguage-link-target"><span>Русиньскый</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Date" title="Модуль:Date – Russian" lang="ru" hreflang="ru" data-title="Модуль:Date" data-language-autonym="Русский" data-language-local-name="Russian" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-skr mw-list-item"><a href="https://skr.wikipedia.org/wiki/%D9%85%D8%A7%DA%88%DB%8C%D9%88%D9%84:Date" title="ماڈیول:Date – Saraiki" lang="skr" hreflang="skr" data-title="ماڈیول:Date" data-language-autonym="سرائیکی" data-language-local-name="Saraiki" class="interlanguage-link-target"><span>سرائیکی</span></a></li><li class="interlanguage-link interwiki-sco mw-list-item"><a href="https://sco.wikipedia.org/wiki/Module:Date" title="Module:Date – Scots" lang="sco" hreflang="sco" data-title="Module:Date" data-language-autonym="Scots" data-language-local-name="Scots" class="interlanguage-link-target"><span>Scots</span></a></li><li class="interlanguage-link interwiki-tn mw-list-item"><a href="https://tn.wikipedia.org/wiki/Module:Date" title="Module:Date – Tswana" lang="tn" hreflang="tn" data-title="Module:Date" data-language-autonym="Setswana" data-language-local-name="Tswana" class="interlanguage-link-target"><span>Setswana</span></a></li><li class="interlanguage-link interwiki-sq mw-list-item"><a href="https://sq.wikipedia.org/wiki/Moduli:Date" title="Moduli:Date – Albanian" lang="sq" hreflang="sq" data-title="Moduli:Date" data-language-autonym="Shqip" data-language-local-name="Albanian" class="interlanguage-link-target"><span>Shqip</span></a></li><li class="interlanguage-link interwiki-si mw-list-item"><a href="https://si.wikipedia.org/wiki/Module:Date" title="Module:Date – Sinhala" lang="si" hreflang="si" data-title="Module:Date" data-language-autonym="සිංහල" data-language-local-name="Sinhala" class="interlanguage-link-target"><span>සිංහල</span></a></li><li class="interlanguage-link interwiki-sd mw-list-item"><a href="https://sd.wikipedia.org/wiki/%D9%85%D8%A7%DA%8A%D9%8A%D9%88%D9%84:Date" title="ماڊيول:Date – Sindhi" lang="sd" hreflang="sd" data-title="ماڊيول:Date" data-language-autonym="سنڌي" data-language-local-name="Sindhi" class="interlanguage-link-target"><span>سنڌي</span></a></li><li class="interlanguage-link interwiki-ss mw-list-item"><a href="https://ss.wikipedia.org/wiki/Module:Date" title="Module:Date – Swati" lang="ss" hreflang="ss" data-title="Module:Date" data-language-autonym="SiSwati" data-language-local-name="Swati" class="interlanguage-link-target"><span>SiSwati</span></a></li><li class="interlanguage-link interwiki-sl mw-list-item"><a href="https://sl.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Slovenian" lang="sl" hreflang="sl" data-title="Modul:Date" data-language-autonym="Slovenščina" data-language-local-name="Slovenian" class="interlanguage-link-target"><span>Slovenščina</span></a></li><li class="interlanguage-link interwiki-ckb mw-list-item"><a href="https://ckb.wikipedia.org/wiki/%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:Date" title="مۆدیوول:Date – Central Kurdish" lang="ckb" hreflang="ckb" data-title="مۆدیوول:Date" data-language-autonym="کوردی" data-language-local-name="Central Kurdish" class="interlanguage-link-target"><span>کوردی</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:Date" title="Модул:Date – Serbian" lang="sr" hreflang="sr" data-title="Модул:Date" data-language-autonym="Српски / srpski" data-language-local-name="Serbian" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-sh mw-list-item"><a href="https://sh.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Serbo-Croatian" lang="sh" hreflang="sh" data-title="Modul:Date" data-language-autonym="Srpskohrvatski / српскохрватски" data-language-local-name="Serbo-Croatian" class="interlanguage-link-target"><span>Srpskohrvatski / српскохрватски</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wikipedia.org/wiki/Moduuli:Fr:Date" title="Moduuli:Fr:Date – Finnish" lang="fi" hreflang="fi" data-title="Moduuli:Fr:Date" data-language-autonym="Suomi" data-language-local-name="Finnish" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-tl mw-list-item"><a href="https://tl.wikipedia.org/wiki/Module:Date" title="Module:Date – Tagalog" lang="tl" hreflang="tl" data-title="Module:Date" data-language-autonym="Tagalog" data-language-local-name="Tagalog" class="interlanguage-link-target"><span>Tagalog</span></a></li><li class="interlanguage-link interwiki-ta mw-list-item"><a href="https://ta.wikipedia.org/wiki/Module:Date" title="Module:Date – Tamil" lang="ta" hreflang="ta" data-title="Module:Date" data-language-autonym="தமிழ்" data-language-local-name="Tamil" class="interlanguage-link-target"><span>தமிழ்</span></a></li><li class="interlanguage-link interwiki-kab mw-list-item"><a href="https://kab.wikipedia.org/wiki/Module:Date" title="Module:Date – Kabyle" lang="kab" hreflang="kab" data-title="Module:Date" data-language-autonym="Taqbaylit" data-language-local-name="Kabyle" class="interlanguage-link-target"><span>Taqbaylit</span></a></li><li class="interlanguage-link interwiki-shn mw-list-item"><a href="https://shn.wikipedia.org/wiki/%E1%80%99%E1%80%B1%E1%82%83%E1%82%87%E1%81%B5%E1%80%BB%E1%80%B0%E1%80%B8:Date" title="မေႃႇၵျူး:Date – Shan" lang="shn" hreflang="shn" data-title="မေႃႇၵျူး:Date" data-language-autonym="ၽႃႇသႃႇတႆး " data-language-local-name="Shan" class="interlanguage-link-target"><span>ၽႃႇသႃႇတႆး </span></a></li><li class="interlanguage-link interwiki-te mw-list-item"><a href="https://te.wikipedia.org/wiki/%E0%B0%AE%E0%B0%BE%E0%B0%A1%E0%B1%8D%E0%B0%AF%E0%B1%82%E0%B0%B2%E0%B1%8D:Date" title="మాడ్యూల్:Date – Telugu" lang="te" hreflang="te" data-title="మాడ్యూల్:Date" data-language-autonym="తెలుగు" data-language-local-name="Telugu" class="interlanguage-link-target"><span>తెలుగు</span></a></li><li class="interlanguage-link interwiki-th mw-list-item"><a href="https://th.wikipedia.org/wiki/%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:Date" title="มอดูล:Date – Thai" lang="th" hreflang="th" data-title="มอดูล:Date" data-language-autonym="ไทย" data-language-local-name="Thai" class="interlanguage-link-target"><span>ไทย</span></a></li><li class="interlanguage-link interwiki-ti mw-list-item"><a href="https://ti.wikipedia.org/wiki/%E1%88%9E%E1%8B%B5%E1%8B%A9%E1%88%8D:Date" title="ሞድዩል:Date – Tigrinya" lang="ti" hreflang="ti" data-title="ሞድዩል:Date" data-language-autonym="ትግርኛ" data-language-local-name="Tigrinya" class="interlanguage-link-target"><span>ትግርኛ</span></a></li><li class="interlanguage-link interwiki-tg mw-list-item"><a href="https://tg.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:Date" title="Модул:Date – Tajik" lang="tg" hreflang="tg" data-title="Модул:Date" data-language-autonym="Тоҷикӣ" data-language-local-name="Tajik" class="interlanguage-link-target"><span>Тоҷикӣ</span></a></li><li class="interlanguage-link interwiki-tcy mw-list-item"><a href="https://tcy.wikipedia.org/wiki/%E0%B2%AE%E0%B3%8B%E0%B2%A1%E0%B3%8D%E0%B2%AF%E0%B3%82%E0%B2%B2%E0%B3%8D:Date" title="ಮೋಡ್ಯೂಲ್:Date – Tulu" lang="tcy" hreflang="tcy" data-title="ಮೋಡ್ಯೂಲ್:Date" data-language-autonym="ತುಳು" data-language-local-name="Tulu" class="interlanguage-link-target"><span>ತುಳು</span></a></li><li class="interlanguage-link interwiki-tr mw-list-item"><a href="https://tr.wikipedia.org/wiki/Mod%C3%BCl:Tarih" title="Modül:Tarih – Turkish" lang="tr" hreflang="tr" data-title="Modül:Tarih" data-language-autonym="Türkçe" data-language-local-name="Turkish" class="interlanguage-link-target"><span>Türkçe</span></a></li><li class="interlanguage-link interwiki-tk mw-list-item"><a href="https://tk.wikipedia.org/wiki/Module:Date" title="Module:Date – Turkmen" lang="tk" hreflang="tk" data-title="Module:Date" data-language-autonym="Türkmençe" data-language-local-name="Turkmen" class="interlanguage-link-target"><span>Türkmençe</span></a></li><li class="interlanguage-link interwiki-kcg mw-list-item"><a href="https://kcg.wikipedia.org/wiki/Module:Date" title="Module:Date – Tyap" lang="kcg" hreflang="kcg" data-title="Module:Date" data-language-autonym="Tyap" data-language-local-name="Tyap" class="interlanguage-link-target"><span>Tyap</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Date" title="Модуль:Date – Ukrainian" lang="uk" hreflang="uk" data-title="Модуль:Date" data-language-autonym="Українська" data-language-local-name="Ukrainian" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-ur mw-list-item"><a href="https://ur.wikipedia.org/wiki/%D9%85%D8%A7%DA%88%DB%8C%D9%88%D9%84:Date" title="ماڈیول:Date – Urdu" lang="ur" hreflang="ur" data-title="ماڈیول:Date" data-language-autonym="اردو" data-language-local-name="Urdu" class="interlanguage-link-target"><span>اردو</span></a></li><li class="interlanguage-link interwiki-vec mw-list-item"><a href="https://vec.wikipedia.org/wiki/Modulo:Date" title="Modulo:Date – Venetian" lang="vec" hreflang="vec" data-title="Modulo:Date" data-language-autonym="Vèneto" data-language-local-name="Venetian" class="interlanguage-link-target"><span>Vèneto</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wikipedia.org/wiki/M%C3%B4_%C4%91un:Date" title="Mô đun:Date – Vietnamese" lang="vi" hreflang="vi" data-title="Mô đun:Date" data-language-autonym="Tiếng Việt" data-language-local-name="Vietnamese" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li><li class="interlanguage-link interwiki-war mw-list-item"><a href="https://war.wikipedia.org/wiki/Module:Date" title="Module:Date – Waray" lang="war" hreflang="war" data-title="Module:Date" data-language-autonym="Winaray" data-language-local-name="Waray" class="interlanguage-link-target"><span>Winaray</span></a></li><li class="interlanguage-link interwiki-wuu mw-list-item"><a href="https://wuu.wikipedia.org/wiki/%E6%A8%A1%E5%9D%97:Date" title="模块:Date – Wu" lang="wuu" hreflang="wuu" data-title="模块:Date" data-language-autonym="吴语" data-language-local-name="Wu" class="interlanguage-link-target"><span>吴语</span></a></li><li class="interlanguage-link interwiki-yi mw-list-item"><a href="https://yi.wikipedia.org/wiki/%D7%99%D7%97%D7%99%D7%93%D7%94:%D7%93%D7%90%D7%98%D7%A2" title="יחידה:דאטע – Yiddish" lang="yi" hreflang="yi" data-title="יחידה:דאטע" data-language-autonym="ייִדיש" data-language-local-name="Yiddish" class="interlanguage-link-target"><span>ייִדיש</span></a></li><li class="interlanguage-link interwiki-yo mw-list-item"><a href="https://yo.wikipedia.org/wiki/Module:Date" title="Module:Date – Yoruba" lang="yo" hreflang="yo" data-title="Module:Date" data-language-autonym="Yorùbá" data-language-local-name="Yoruba" class="interlanguage-link-target"><span>Yorùbá</span></a></li><li class="interlanguage-link interwiki-zh-yue mw-list-item"><a href="https://zh-yue.wikipedia.org/wiki/%E6%A8%A1%E7%B5%84:Date" title="模組:Date – Cantonese" lang="yue" hreflang="yue" data-title="模組:Date" data-language-autonym="粵語" data-language-local-name="Cantonese" class="interlanguage-link-target"><span>粵語</span></a></li><li class="interlanguage-link interwiki-diq mw-list-item"><a href="https://diq.wikipedia.org/wiki/Modul:Date" title="Modul:Date – Zazaki" lang="diq" hreflang="diq" data-title="Modul:Date" data-language-autonym="Zazaki" data-language-local-name="Zazaki" class="interlanguage-link-target"><span>Zazaki</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/Module:Date" title="Module:Date – Chinese" lang="zh" hreflang="zh" data-title="Module:Date" data-language-autonym="中文" data-language-local-name="Chinese" class="interlanguage-link-target"><span>中文</span></a></li><li class="interlanguage-link interwiki-igl mw-list-item"><a href="https://igl.wikipedia.org/wiki/Module:Date" title="Module:Date – Igala" lang="igl" hreflang="igl" data-title="Module:Date" data-language-autonym="Igala" data-language-local-name="Igala" class="interlanguage-link-target"><span>Igala</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q19963557#sitelinks-wikipedia" title="Edit interlanguage links" class="wbc-editpage">Change links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-module" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Module:Date" title="View the module page [c]" accesskey="c"><span>Module</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Module_talk:Date" rel="discussion" title="Discussion about the content page [t]" accesskey="t"><span>Talk</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Module:Date"><span>Read</span></a></li><li id="ca-viewsource" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module:Date&action=edit" title="This page is protected. You can view its source [e]" accesskey="e"><span>View source</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module:Date&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Module:Date"><span>Read</span></a></li><li id="ca-more-viewsource" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Module:Date&action=edit"><span>View source</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Module:Date&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Module:Date" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Module:Date" rel="nofollow" title="New changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Module:Date&oldid=8554926" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Module:Date&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fsimple.wikipedia.org%2Fwiki%2FModule%3ADate"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fsimple.wikipedia.org%2Fwiki%2FModule%3ADate"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-electronpdfservice-sidebar-portlet-heading" class="vector-menu mw-portlet mw-portlet-electronpdfservice-sidebar-portlet-heading" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="electron-print_pdf" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Module%3ADate&action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="javascript:print();" rel="alternate" title="Printable version of this page [p]" accesskey="p"><span>Page for printing</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="wb-otherproject-link wb-otherproject-commons mw-list-item"><a href="https://commons.wikimedia.org/wiki/Module:Date" hreflang="en"><span>Wikimedia Commons</span></a></li><li class="wb-otherproject-link wb-otherproject-meta mw-list-item"><a href="https://meta.wikimedia.org/wiki/Module:Date" hreflang="en"><span>Meta-Wiki</span></a></li><li class="wb-otherproject-link wb-otherproject-species mw-list-item"><a href="https://species.wikimedia.org/wiki/Module:Date" hreflang="en"><span>Wikispecies</span></a></li><li class="wb-otherproject-link wb-otherproject-wikidata mw-list-item"><a href="https://www.wikidata.org/wiki/Module:Date" hreflang="en"><span>Wikidata</span></a></li><li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q19963557" title="Link to connected data repository item [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From Simple English Wikipedia, the free encyclopedia</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p>This module provides date functions for use by other modules. Dates in the <a href="/wiki/Gregorian_calendar" title="Gregorian calendar">Gregorian calendar</a> and the <a href="/wiki/Julian_calendar" title="Julian calendar">Julian calendar</a> are supported, from 9999 BCE to 9999 CE. The calendars are proleptic—they are assumed to apply at all times with no irregularities. </p><p>A date, with an optional time, can be specified in a variety of formats, and can be converted for display using a variety of formats, for example, 1 April 2016 or April 1, 2016. The properties of a date include its <a href="/wiki/Julian_day" title="Julian day">Julian date</a> and its Gregorian serial date, as well as the day-of-week and day-of-year. </p><p>Dates can be compared (for example, <code>date1 <= date2</code>), and can be used with add or subtract (for example, <code>date + '3 months'</code>). The difference between two dates can be determined with <code>date1 - date2</code>. These operations work with both Gregorian and Julian calendar dates, but <code>date1 - date2</code> is nil if the two dates use different calendars. </p><p>The module provides the following items. </p> <table class="wikitable"> <tbody><tr> <th>Export</th> <th>Description </th></tr> <tr> <td><code>_current</code></td> <td>Table with the current year, month, day, hour, minute, second. </td></tr> <tr> <td><code>_Date</code></td> <td>Function that returns a table for a specified date. </td></tr> <tr> <td><code>_days_in_month</code></td> <td>Function that returns the number of days in a month. </td></tr></tbody></table> <p>The following has examples of using the module: </p> <ul><li><a href="/wiki/Module:Date/example" title="Module:Date/example">Module:Date/example</a> • Demonstration showing how Module:Date may be used.</li> <li><a href="/wiki/Module_talk:Date/example" title="Module talk:Date/example">Module talk:Date/example</a> • Output from the demonstration.</li></ul> <div class="mw-heading mw-heading2"><h2 id="Formatted_output">Formatted output</h2></div> <p>A date can be formatted as text. </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">local</span> <span class="n">Date</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s1">'Module:Date'</span><span class="p">).</span><span class="n">_Date</span> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span><span class="n">text</span><span class="p">()</span> <span class="c1">-- result is '1 July 2016'</span> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span><span class="n">text</span><span class="p">(</span><span class="s1">'%-d %B'</span><span class="p">)</span> <span class="c1">-- result is '1 July'</span> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'1 July 2016'</span><span class="p">):</span><span class="n">text</span><span class="p">(</span><span class="s1">'mdy'</span><span class="p">)</span> <span class="c1">-- result is 'July 1, 2016'</span> </pre></div> <p>The following simplified formatting codes are available. </p> <table class="wikitable"> <tbody><tr> <th>Code</th> <th>Result </th></tr> <tr> <td>hm</td> <td>hour:minute, with "am" or "pm" or variant, if specified (14:30 or 2:30 pm or variant) </td></tr> <tr> <td>hms</td> <td>hour:minute:second (14:30:45) </td></tr> <tr> <td>ymd</td> <td>year-month-day (2016-07-01) </td></tr> <tr> <td>mdy</td> <td>month day, year (July 1, 2016) </td></tr> <tr> <td>dmy</td> <td>day month year (1 July 2016) </td></tr></tbody></table> <p>The following formatting codes (similar to <a href="/w/index.php?title=Strftime&action=edit&redlink=1" class="new" title="Strftime (not yet started)">strftime</a>) are available. </p> <table class="wikitable"> <tbody><tr> <th>Code</th> <th>Result </th></tr> <tr> <td>%a</td> <td>Day abbreviation: Mon, Tue, ... </td></tr> <tr> <td>%A</td> <td>Day name: Monday, Tuesday, ... </td></tr> <tr> <td>%u</td> <td>Day of week: 1 to 7 (Monday to Sunday) </td></tr> <tr> <td>%w</td> <td>Day of week: 0 to 6 (Sunday to Saturday) </td></tr> <tr> <td>%d</td> <td>Day of month zero-padded: 01 to 31 </td></tr> <tr> <td>%b</td> <td>Month abbreviation: Jan to Dec </td></tr> <tr> <td>%B</td> <td>Month name: January to December </td></tr> <tr> <td>%m</td> <td>Month zero-padded: 01 to 12 </td></tr> <tr> <td>%Y</td> <td>Year zero-padded: 0012, 0120, 1200 </td></tr> <tr> <td>%H</td> <td>Hour 24-hour clock zero-padded: 00 to 23 </td></tr> <tr> <td>%I</td> <td>Hour 12-hour clock zero-padded: 01 to 12 </td></tr> <tr> <td>%p</td> <td>AM or PM or as in options </td></tr> <tr> <td>%M</td> <td>Minute zero-padded: 00 to 59 </td></tr> <tr> <td>%S</td> <td>Second zero-padded: 00 to 59 </td></tr> <tr> <td>%j</td> <td>Day of year zero-padded: 001 to 366 </td></tr> <tr> <td>%-d</td> <td>Day of month: 1 to 31 </td></tr> <tr> <td>%-m</td> <td>Month: 1 to 12 </td></tr> <tr> <td>%-Y</td> <td>Year: 12, 120, 1200 </td></tr> <tr> <td>%-H</td> <td>Hour: 0 to 23 </td></tr> <tr> <td>%-M</td> <td>Minute: 0 to 59 </td></tr> <tr> <td>%-S</td> <td>Second: 0 to 59 </td></tr> <tr> <td>%-j</td> <td>Day of year: 1 to 366 </td></tr> <tr> <td>%-I</td> <td>Hour: 1 to 12 </td></tr> <tr> <td>%%</td> <td>% </td></tr></tbody></table> <p>In addition, <code>%{<i>property</i>}</code> (where <code><i>property</i></code> is any property of a date) can be used. </p><p>For example, <code>Date('1 Feb 2015 14:30:45 A.D.')</code> has the following properties. </p> <table class="wikitable"> <tbody><tr> <th>Code</th> <th>Result </th></tr> <tr> <td>%{calendar}</td> <td>Gregorian </td></tr> <tr> <td>%{year}</td> <td>2015 </td></tr> <tr> <td>%{month}</td> <td>2 </td></tr> <tr> <td>%{day}</td> <td>1 </td></tr> <tr> <td>%{hour}</td> <td>14 </td></tr> <tr> <td>%{minute}</td> <td>30 </td></tr> <tr> <td>%{second}</td> <td>45 </td></tr> <tr> <td>%{dayabbr}</td> <td>Sun </td></tr> <tr> <td>%{dayname}</td> <td>Sunday </td></tr> <tr> <td>%{dayofweek}</td> <td>0 </td></tr> <tr> <td>%{dow}</td> <td>0 (same as dayofweek) </td></tr> <tr> <td>%{dayofweekiso}</td> <td>7 </td></tr> <tr> <td>%{dowiso}</td> <td>7 (same as dayofweekiso) </td></tr> <tr> <td>%{dayofyear}</td> <td>32 </td></tr> <tr> <td>%{era}</td> <td>A.D. </td></tr> <tr> <td>%{gsd}</td> <td>735630 (numbers of days from 1 January 1 CE; the first is day 1) </td></tr> <tr> <td>%{juliandate}</td> <td>2457055.1046875 (<a href="/wiki/Julian_day" title="Julian day">Julian day</a>) </td></tr> <tr> <td>%{jd}</td> <td>2457055.1046875 (same as juliandate) </td></tr> <tr> <td>%{isleapyear}</td> <td>false </td></tr> <tr> <td>%{monthdays}</td> <td>28 </td></tr> <tr> <td>%{monthabbr}</td> <td>Feb </td></tr> <tr> <td>%{monthname}</td> <td>February </td></tr></tbody></table> <p>Some shortcuts are available. Given <code>date = Date('1 Feb 2015 14:30')</code>, the following results would occur. </p> <table class="wikitable"> <tbody><tr> <th>Code</th> <th>Description</th> <th>Example result</th> <th>Equivalent format </th></tr> <tr> <td>date:text('%c')</td> <td>date and time</td> <td>2:30 pm 1 February 2015</td> <td>%-I:%M %p %-d %B %-Y %{era} </td></tr> <tr> <td>date:text('%x')</td> <td>date</td> <td>1 February 2015</td> <td>%-d %B %-Y %{era} </td></tr> <tr> <td>date:text('%X')</td> <td>time</td> <td>2:30 pm</td> <td>%-I:%M %p </td></tr></tbody></table> <div class="mw-heading mw-heading2"><h2 id="Julian_date">Julian date</h2></div> <p>The following has an example of converting a <a href="/wiki/Julian_day" title="Julian day">Julian date</a> to a date, then obtaining information about the date. </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Code -- Result</span> <span class="n">Date</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s1">'Module:Date'</span><span class="p">).</span><span class="n">_Date</span> <span class="n">date</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'juliandate'</span><span class="p">,</span> <span class="mi">320</span><span class="p">)</span> <span class="n">number</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">gsd</span> <span class="c1">-- -1721105</span> <span class="n">number</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">jd</span> <span class="c1">-- 320</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">dayname</span> <span class="c1">-- Saturday</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">()</span> <span class="c1">-- 9 October 4713&nbsp;BC</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'%Y-%m-%d'</span><span class="p">)</span> <span class="c1">-- 4713-10-09</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'%{era} %Y-%m-%d'</span><span class="p">)</span> <span class="c1">-- BC 4713-10-09</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'%Y-%m-%d %{era}'</span><span class="p">)</span> <span class="c1">-- 4713-10-09&nbsp;BC</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'%Y-%m-%d %{era}'</span><span class="p">,</span> <span class="s1">'era=B.C.E.'</span><span class="p">)</span> <span class="c1">-- 4713-10-09&nbsp;B.C.E.</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'%Y-%m-%d'</span><span class="p">,</span> <span class="s1">'era=BCNEGATIVE'</span><span class="p">)</span> <span class="c1">-- -4712-10-09</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'%Y-%m-%d'</span><span class="p">,</span> <span class="s1">'era=BCMINUS'</span><span class="p">)</span> <span class="c1">-- −4712-10-09 (uses Unicode MINUS SIGN U+2212)</span> <span class="n">text</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'juliandate'</span><span class="p">,</span><span class="mi">320</span><span class="p">):</span><span class="n">text</span><span class="p">(</span><span class="s1">'%{gsd} %{jd}'</span><span class="p">)</span> <span class="c1">-- -1721105 320</span> <span class="n">text</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'Oct 9, 4713 B.C.E.'</span><span class="p">):</span><span class="n">text</span><span class="p">(</span><span class="s1">'%{gsd} %{jd}'</span><span class="p">)</span> <span class="c1">-- -1721105 320</span> <span class="n">text</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="o">-</span><span class="mi">4712</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">9</span><span class="p">):</span><span class="n">text</span><span class="p">(</span><span class="s1">'%{gsd} %{jd}'</span><span class="p">)</span> <span class="c1">-- -1721105 320</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Date_differences">Date differences</h2></div> <p>The difference between two dates can be determined with <code>date1 - date2</code>. The result is valid if both dates use the Gregorian calendar or if both dates use the Julian calendar, otherwise the result is nil. An age and duration can be calculated from a date difference. </p><p>For example: </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">-- Code -- Result</span> <span class="n">Date</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s1">'Module:Date'</span><span class="p">).</span><span class="n">_Date</span> <span class="n">date1</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'21 Mar 2015'</span><span class="p">)</span> <span class="n">date2</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'4 Dec 1999'</span><span class="p">)</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">date2</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">age_days</span> <span class="c1">-- 5586</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">years</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">months</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">days</span> <span class="c1">-- 15, 3, 17 (15 years + 3 months + 17 days)</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">:</span><span class="n">age</span><span class="p">(</span><span class="s1">'ymd'</span><span class="p">)</span> <span class="c1">-- 15, 3, 17</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">:</span><span class="n">age</span><span class="p">(</span><span class="s1">'ymwd'</span><span class="p">)</span> <span class="c1">-- 15, 3, 2, 3 (15 years + 3 months + 2 weeks + 3 days)</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">:</span><span class="n">duration</span><span class="p">(</span><span class="s1">'ymwd'</span><span class="p">)</span> <span class="c1">-- 15, 3, 2, 4</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">:</span><span class="n">duration</span><span class="p">(</span><span class="s1">'d'</span><span class="p">)</span> <span class="c1">-- 5587 (a duration includes the final day)</span> </pre></div> <p>A date difference holds the original dates except they are swapped so <code>diff.date1 >= diff.date2</code> (<code>diff.date1</code> is the more recent date). This is shown in the following. </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="n">date1</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'21 Mar 2015'</span><span class="p">)</span> <span class="n">date2</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'4 Dec 1999'</span><span class="p">)</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">date2</span> <span class="n">neg</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">isnegative</span> <span class="c1">-- false</span> <span class="n">text</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">date1</span><span class="p">:</span><span class="n">text</span><span class="p">()</span> <span class="c1">-- 21 March 2015</span> <span class="n">text</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">date2</span><span class="p">:</span><span class="n">text</span><span class="p">()</span> <span class="c1">-- 4 December 1999</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">date2</span> <span class="o">-</span> <span class="n">date1</span> <span class="n">neg</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">isnegative</span> <span class="c1">-- true (dates have been swapped)</span> <span class="n">text</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">date1</span><span class="p">:</span><span class="n">text</span><span class="p">()</span> <span class="c1">-- 21 March 2015</span> <span class="n">text</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">date2</span><span class="p">:</span><span class="n">text</span><span class="p">()</span> <span class="c1">-- 4 December 1999</span> </pre></div> <p>A date difference also holds a time difference: </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="n">date1</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'8 Mar 2016 0:30:45'</span><span class="p">)</span> <span class="n">date2</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'19 Jan 2014 22:55'</span><span class="p">)</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">date2</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">years</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">months</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">days</span> <span class="c1">-- 2, 1, 17</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">hours</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">minutes</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">seconds</span> <span class="c1">-- 1, 35, 45</span> </pre></div> <p>A date difference can be added to a date, or subtracted from a date. </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span><span class="n">date1</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'8 Mar 2016 0:30:45'</span><span class="p">)</span> <span class="n">date2</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="s1">'19 Jan 2014 22:55'</span><span class="p">)</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">date2</span> <span class="n">date3</span> <span class="o">=</span> <span class="n">date2</span> <span class="o">+</span> <span class="n">diff</span> <span class="n">date4</span> <span class="o">=</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">diff</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date3</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'ymd hms'</span><span class="p">)</span> <span class="c1">-- 2016-03-08 00:30:45</span> <span class="n">text</span> <span class="o">=</span> <span class="n">date4</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="s1">'ymd hms'</span><span class="p">)</span> <span class="c1">-- 2014-01-19 22:55:00</span> <span class="n">equal</span> <span class="o">=</span> <span class="p">(</span><span class="n">date1</span> <span class="o">==</span> <span class="n">date3</span><span class="p">)</span> <span class="c1">-- true</span> <span class="n">equal</span> <span class="o">=</span> <span class="p">(</span><span class="n">date2</span> <span class="o">==</span> <span class="n">date4</span><span class="p">)</span> <span class="c1">-- true</span> </pre></div> <p>The age and duration methods of a date difference accept a code that identifies the components that should be returned. An extra day is included for the duration method because it includes the final day. </p> <table class="wikitable"> <tbody><tr> <th>Code</th> <th>Returned values </th></tr> <tr> <td><code>'ymwd'</code></td> <td>years, months, weeks, days </td></tr> <tr> <td><code>'ymd'</code></td> <td>years, months, days </td></tr> <tr> <td><code>'ym'</code></td> <td>years, months </td></tr> <tr> <td><code>'y'</code></td> <td>years </td></tr> <tr> <td><code>'m'</code></td> <td>months </td></tr> <tr> <td><code>'wd'</code></td> <td>weeks, days </td></tr> <tr> <td><code>'w'</code></td> <td>weeks </td></tr> <tr> <td><code>'d'</code></td> <td>days </td></tr></tbody></table> <hr /><div class="mw-highlight mw-highlight-lang-lua mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos" data-line="1"></span></a><span class="c1">-- Date functions for use by other modules.</span> </span><span id="L-2"><a href="#L-2"><span class="linenos" data-line="2"></span></a><span class="c1">-- I18N and time zones are not supported.</span> </span><span id="L-3"><a href="#L-3"><span class="linenos" data-line="3"></span></a> </span><span id="L-4"><a href="#L-4"><span class="linenos" data-line="4"></span></a><span class="kd">local</span> <span class="n">MINUS</span> <span class="o">=</span> <span class="s1">'−'</span> <span class="c1">-- Unicode U+2212 MINUS SIGN</span> </span><span id="L-5"><a href="#L-5"><span class="linenos" data-line="5"></span></a><span class="kd">local</span> <span class="n">floor</span> <span class="o">=</span> <span class="nb">math.floor</span> </span><span id="L-6"><a href="#L-6"><span class="linenos" data-line="6"></span></a> </span><span id="L-7"><a href="#L-7"><span class="linenos" data-line="7"></span></a><span class="kd">local</span> <span class="n">Date</span><span class="p">,</span> <span class="n">DateDiff</span><span class="p">,</span> <span class="n">diffmt</span> <span class="c1">-- forward declarations</span> </span><span id="L-8"><a href="#L-8"><span class="linenos" data-line="8"></span></a><span class="kd">local</span> <span class="n">uniq</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'unique identifier'</span> <span class="p">}</span> </span><span id="L-9"><a href="#L-9"><span class="linenos" data-line="9"></span></a> </span><span id="L-10"><a href="#L-10"><span class="linenos" data-line="10"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_date</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> </span><span id="L-11"><a href="#L-11"><span class="linenos" data-line="11"></span></a> <span class="c1">-- The system used to make a date read-only means there is no unique</span> </span><span id="L-12"><a href="#L-12"><span class="linenos" data-line="12"></span></a> <span class="c1">-- metatable that is conveniently accessible to check.</span> </span><span id="L-13"><a href="#L-13"><span class="linenos" data-line="13"></span></a> <span class="kr">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="ow">and</span> <span class="n">t</span><span class="p">.</span><span class="n">_id</span> <span class="o">==</span> <span class="n">uniq</span> </span><span id="L-14"><a href="#L-14"><span class="linenos" data-line="14"></span></a><span class="kr">end</span> </span><span id="L-15"><a href="#L-15"><span class="linenos" data-line="15"></span></a> </span><span id="L-16"><a href="#L-16"><span class="linenos" data-line="16"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_diff</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> </span><span id="L-17"><a href="#L-17"><span class="linenos" data-line="17"></span></a> <span class="kr">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="ow">and</span> <span class="nb">getmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">==</span> <span class="n">diffmt</span> </span><span id="L-18"><a href="#L-18"><span class="linenos" data-line="18"></span></a><span class="kr">end</span> </span><span id="L-19"><a href="#L-19"><span class="linenos" data-line="19"></span></a> </span><span id="L-20"><a href="#L-20"><span class="linenos" data-line="20"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">_list_join</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">sep</span><span class="p">)</span> </span><span id="L-21"><a href="#L-21"><span class="linenos" data-line="21"></span></a> <span class="kr">return</span> <span class="nb">table.concat</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">sep</span><span class="p">)</span> </span><span id="L-22"><a href="#L-22"><span class="linenos" data-line="22"></span></a><span class="kr">end</span> </span><span id="L-23"><a href="#L-23"><span class="linenos" data-line="23"></span></a> </span><span id="L-24"><a href="#L-24"><span class="linenos" data-line="24"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">collection</span><span class="p">()</span> </span><span id="L-25"><a href="#L-25"><span class="linenos" data-line="25"></span></a> <span class="c1">-- Return a table to hold items.</span> </span><span id="L-26"><a href="#L-26"><span class="linenos" data-line="26"></span></a> <span class="kr">return</span> <span class="p">{</span> </span><span id="L-27"><a href="#L-27"><span class="linenos" data-line="27"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> </span><span id="L-28"><a href="#L-28"><span class="linenos" data-line="28"></span></a> <span class="n">add</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span> </span><span id="L-29"><a href="#L-29"><span class="linenos" data-line="29"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">n</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-30"><a href="#L-30"><span class="linenos" data-line="30"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">item</span> </span><span id="L-31"><a href="#L-31"><span class="linenos" data-line="31"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-32"><a href="#L-32"><span class="linenos" data-line="32"></span></a> <span class="n">join</span> <span class="o">=</span> <span class="n">_list_join</span><span class="p">,</span> </span><span id="L-33"><a href="#L-33"><span class="linenos" data-line="33"></span></a> <span class="p">}</span> </span><span id="L-34"><a href="#L-34"><span class="linenos" data-line="34"></span></a><span class="kr">end</span> </span><span id="L-35"><a href="#L-35"><span class="linenos" data-line="35"></span></a> </span><span id="L-36"><a href="#L-36"><span class="linenos" data-line="36"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">strip_to_nil</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-37"><a href="#L-37"><span class="linenos" data-line="37"></span></a> <span class="c1">-- If text is a string, return its trimmed content, or nil if empty.</span> </span><span id="L-38"><a href="#L-38"><span class="linenos" data-line="38"></span></a> <span class="c1">-- Otherwise return text (convenient when Date fields are provided from</span> </span><span id="L-39"><a href="#L-39"><span class="linenos" data-line="39"></span></a> <span class="c1">-- another module which may pass a string, a number, or another type).</span> </span><span id="L-40"><a href="#L-40"><span class="linenos" data-line="40"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-41"><a href="#L-41"><span class="linenos" data-line="41"></span></a> <span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'(%S.-)%s*$'</span><span class="p">)</span> </span><span id="L-42"><a href="#L-42"><span class="linenos" data-line="42"></span></a> <span class="kr">end</span> </span><span id="L-43"><a href="#L-43"><span class="linenos" data-line="43"></span></a> <span class="kr">return</span> <span class="n">text</span> </span><span id="L-44"><a href="#L-44"><span class="linenos" data-line="44"></span></a><span class="kr">end</span> </span><span id="L-45"><a href="#L-45"><span class="linenos" data-line="45"></span></a> </span><span id="L-46"><a href="#L-46"><span class="linenos" data-line="46"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_leap_year</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">calname</span><span class="p">)</span> </span><span id="L-47"><a href="#L-47"><span class="linenos" data-line="47"></span></a> <span class="c1">-- Return true if year is a leap year.</span> </span><span id="L-48"><a href="#L-48"><span class="linenos" data-line="48"></span></a> <span class="kr">if</span> <span class="n">calname</span> <span class="o">==</span> <span class="s1">'Julian'</span> <span class="kr">then</span> </span><span id="L-49"><a href="#L-49"><span class="linenos" data-line="49"></span></a> <span class="kr">return</span> <span class="n">year</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span> </span><span id="L-50"><a href="#L-50"><span class="linenos" data-line="50"></span></a> <span class="kr">end</span> </span><span id="L-51"><a href="#L-51"><span class="linenos" data-line="51"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">year</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">year</span> <span class="o">%</span> <span class="mi">100</span> <span class="o">~=</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="n">year</span> <span class="o">%</span> <span class="mi">400</span> <span class="o">==</span> <span class="mi">0</span> </span><span id="L-52"><a href="#L-52"><span class="linenos" data-line="52"></span></a><span class="kr">end</span> </span><span id="L-53"><a href="#L-53"><span class="linenos" data-line="53"></span></a> </span><span id="L-54"><a href="#L-54"><span class="linenos" data-line="54"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">days_in_month</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="n">calname</span><span class="p">)</span> </span><span id="L-55"><a href="#L-55"><span class="linenos" data-line="55"></span></a> <span class="c1">-- Return number of days (1..31) in given month (1..12).</span> </span><span id="L-56"><a href="#L-56"><span class="linenos" data-line="56"></span></a> <span class="kr">if</span> <span class="n">month</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">is_leap_year</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">calname</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-57"><a href="#L-57"><span class="linenos" data-line="57"></span></a> <span class="kr">return</span> <span class="mi">29</span> </span><span id="L-58"><a href="#L-58"><span class="linenos" data-line="58"></span></a> <span class="kr">end</span> </span><span id="L-59"><a href="#L-59"><span class="linenos" data-line="59"></span></a> <span class="kr">return</span> <span class="p">({</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">31</span> <span class="p">})[</span><span class="n">month</span><span class="p">]</span> </span><span id="L-60"><a href="#L-60"><span class="linenos" data-line="60"></span></a><span class="kr">end</span> </span><span id="L-61"><a href="#L-61"><span class="linenos" data-line="61"></span></a> </span><span id="L-62"><a href="#L-62"><span class="linenos" data-line="62"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">h_m_s</span><span class="p">(</span><span class="n">time</span><span class="p">)</span> </span><span id="L-63"><a href="#L-63"><span class="linenos" data-line="63"></span></a> <span class="c1">-- Return hour, minute, second extracted from fraction of a day.</span> </span><span id="L-64"><a href="#L-64"><span class="linenos" data-line="64"></span></a> <span class="n">time</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">time</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">3600</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span> <span class="c1">-- number of seconds</span> </span><span id="L-65"><a href="#L-65"><span class="linenos" data-line="65"></span></a> <span class="kd">local</span> <span class="n">second</span> <span class="o">=</span> <span class="n">time</span> <span class="o">%</span> <span class="mi">60</span> </span><span id="L-66"><a href="#L-66"><span class="linenos" data-line="66"></span></a> <span class="n">time</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">time</span> <span class="o">/</span> <span class="mi">60</span><span class="p">)</span> </span><span id="L-67"><a href="#L-67"><span class="linenos" data-line="67"></span></a> <span class="kr">return</span> <span class="n">floor</span><span class="p">(</span><span class="n">time</span> <span class="o">/</span> <span class="mi">60</span><span class="p">),</span> <span class="n">time</span> <span class="o">%</span> <span class="mi">60</span><span class="p">,</span> <span class="n">second</span> </span><span id="L-68"><a href="#L-68"><span class="linenos" data-line="68"></span></a><span class="kr">end</span> </span><span id="L-69"><a href="#L-69"><span class="linenos" data-line="69"></span></a> </span><span id="L-70"><a href="#L-70"><span class="linenos" data-line="70"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">hms</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> </span><span id="L-71"><a href="#L-71"><span class="linenos" data-line="71"></span></a> <span class="c1">-- Return fraction of a day from date's time, where (0 <= fraction < 1)</span> </span><span id="L-72"><a href="#L-72"><span class="linenos" data-line="72"></span></a> <span class="c1">-- if the values are valid, but could be anything if outside range.</span> </span><span id="L-73"><a href="#L-73"><span class="linenos" data-line="73"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">+</span> <span class="p">(</span><span class="n">date</span><span class="p">.</span><span class="n">minute</span> <span class="o">+</span> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">/</span> <span class="mi">60</span><span class="p">)</span> <span class="o">/</span> <span class="mi">60</span><span class="p">)</span> <span class="o">/</span> <span class="mi">24</span> </span><span id="L-74"><a href="#L-74"><span class="linenos" data-line="74"></span></a><span class="kr">end</span> </span><span id="L-75"><a href="#L-75"><span class="linenos" data-line="75"></span></a> </span><span id="L-76"><a href="#L-76"><span class="linenos" data-line="76"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">julian_date</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> </span><span id="L-77"><a href="#L-77"><span class="linenos" data-line="77"></span></a> <span class="c1">-- Return jd, jdz from a Julian or Gregorian calendar date where</span> </span><span id="L-78"><a href="#L-78"><span class="linenos" data-line="78"></span></a> <span class="c1">-- jd = Julian date and its fractional part is zero at noon</span> </span><span id="L-79"><a href="#L-79"><span class="linenos" data-line="79"></span></a> <span class="c1">-- jdz = same, but assume time is 00:00:00 if no time given</span> </span><span id="L-80"><a href="#L-80"><span class="linenos" data-line="80"></span></a> <span class="c1">-- http://www.tondering.dk/claus/cal/julperiod.php#formula</span> </span><span id="L-81"><a href="#L-81"><span class="linenos" data-line="81"></span></a> <span class="c1">-- Testing shows this works for all dates from year -9999 to 9999!</span> </span><span id="L-82"><a href="#L-82"><span class="linenos" data-line="82"></span></a> <span class="c1">-- JDN 0 is the 24-hour period starting at noon UTC on Monday</span> </span><span id="L-83"><a href="#L-83"><span class="linenos" data-line="83"></span></a> <span class="c1">-- 1 January 4713 BC = (-4712, 1, 1) Julian calendar</span> </span><span id="L-84"><a href="#L-84"><span class="linenos" data-line="84"></span></a> <span class="c1">-- 24 November 4714 BC = (-4713, 11, 24) Gregorian calendar</span> </span><span id="L-85"><a href="#L-85"><span class="linenos" data-line="85"></span></a> <span class="kd">local</span> <span class="n">offset</span> </span><span id="L-86"><a href="#L-86"><span class="linenos" data-line="86"></span></a> <span class="kd">local</span> <span class="n">a</span> <span class="o">=</span> <span class="n">floor</span><span class="p">((</span><span class="mi">14</span> <span class="o">-</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span><span class="p">)</span><span class="o">/</span><span class="mi">12</span><span class="p">)</span> </span><span id="L-87"><a href="#L-87"><span class="linenos" data-line="87"></span></a> <span class="kd">local</span> <span class="n">y</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">+</span> <span class="mi">4800</span> <span class="o">-</span> <span class="n">a</span> </span><span id="L-88"><a href="#L-88"><span class="linenos" data-line="88"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">calendar</span> <span class="o">==</span> <span class="s1">'Julian'</span> <span class="kr">then</span> </span><span id="L-89"><a href="#L-89"><span class="linenos" data-line="89"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">y</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span> <span class="o">-</span> <span class="mi">32083</span> </span><span id="L-90"><a href="#L-90"><span class="linenos" data-line="90"></span></a> <span class="kr">else</span> </span><span id="L-91"><a href="#L-91"><span class="linenos" data-line="91"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">y</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span> <span class="o">-</span> <span class="n">floor</span><span class="p">(</span><span class="n">y</span><span class="o">/</span><span class="mi">100</span><span class="p">)</span> <span class="o">+</span> <span class="n">floor</span><span class="p">(</span><span class="n">y</span><span class="o">/</span><span class="mi">400</span><span class="p">)</span> <span class="o">-</span> <span class="mi">32045</span> </span><span id="L-92"><a href="#L-92"><span class="linenos" data-line="92"></span></a> <span class="kr">end</span> </span><span id="L-93"><a href="#L-93"><span class="linenos" data-line="93"></span></a> <span class="kd">local</span> <span class="n">m</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="o">+</span> <span class="mi">12</span><span class="o">*</span><span class="n">a</span> <span class="o">-</span> <span class="mi">3</span> </span><span id="L-94"><a href="#L-94"><span class="linenos" data-line="94"></span></a> <span class="kd">local</span> <span class="n">jd</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">+</span> <span class="n">floor</span><span class="p">((</span><span class="mi">153</span><span class="o">*</span><span class="n">m</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="mi">5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">365</span><span class="o">*</span><span class="n">y</span> <span class="o">+</span> <span class="n">offset</span> </span><span id="L-95"><a href="#L-95"><span class="linenos" data-line="95"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">hastime</span> <span class="kr">then</span> </span><span id="L-96"><a href="#L-96"><span class="linenos" data-line="96"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="n">jd</span> <span class="o">+</span> <span class="n">hms</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> <span class="o">-</span> <span class="mf">0.5</span> </span><span id="L-97"><a href="#L-97"><span class="linenos" data-line="97"></span></a> <span class="kr">return</span> <span class="n">jd</span><span class="p">,</span> <span class="n">jd</span> </span><span id="L-98"><a href="#L-98"><span class="linenos" data-line="98"></span></a> <span class="kr">end</span> </span><span id="L-99"><a href="#L-99"><span class="linenos" data-line="99"></span></a> <span class="kr">return</span> <span class="n">jd</span><span class="p">,</span> <span class="n">jd</span> <span class="o">-</span> <span class="mf">0.5</span> </span><span id="L-100"><a href="#L-100"><span class="linenos" data-line="100"></span></a><span class="kr">end</span> </span><span id="L-101"><a href="#L-101"><span class="linenos" data-line="101"></span></a> </span><span id="L-102"><a href="#L-102"><span class="linenos" data-line="102"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">set_date_from_jd</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> </span><span id="L-103"><a href="#L-103"><span class="linenos" data-line="103"></span></a> <span class="c1">-- Set the fields of table date from its Julian date field.</span> </span><span id="L-104"><a href="#L-104"><span class="linenos" data-line="104"></span></a> <span class="c1">-- Return true if date is valid.</span> </span><span id="L-105"><a href="#L-105"><span class="linenos" data-line="105"></span></a> <span class="c1">-- http://www.tondering.dk/claus/cal/julperiod.php#formula</span> </span><span id="L-106"><a href="#L-106"><span class="linenos" data-line="106"></span></a> <span class="c1">-- This handles the proleptic Julian and Gregorian calendars.</span> </span><span id="L-107"><a href="#L-107"><span class="linenos" data-line="107"></span></a> <span class="c1">-- Negative Julian dates are not defined but they work.</span> </span><span id="L-108"><a href="#L-108"><span class="linenos" data-line="108"></span></a> <span class="kd">local</span> <span class="n">calname</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">calendar</span> </span><span id="L-109"><a href="#L-109"><span class="linenos" data-line="109"></span></a> <span class="kd">local</span> <span class="n">low</span><span class="p">,</span> <span class="n">high</span> <span class="c1">-- min/max limits for date ranges −9999-01-01 to 9999-12-31</span> </span><span id="L-110"><a href="#L-110"><span class="linenos" data-line="110"></span></a> <span class="kr">if</span> <span class="n">calname</span> <span class="o">==</span> <span class="s1">'Gregorian'</span> <span class="kr">then</span> </span><span id="L-111"><a href="#L-111"><span class="linenos" data-line="111"></span></a> <span class="n">low</span><span class="p">,</span> <span class="n">high</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1930999.5</span><span class="p">,</span> <span class="mf">5373484.49999</span> </span><span id="L-112"><a href="#L-112"><span class="linenos" data-line="112"></span></a> <span class="kr">elseif</span> <span class="n">calname</span> <span class="o">==</span> <span class="s1">'Julian'</span> <span class="kr">then</span> </span><span id="L-113"><a href="#L-113"><span class="linenos" data-line="113"></span></a> <span class="n">low</span><span class="p">,</span> <span class="n">high</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1931076.5</span><span class="p">,</span> <span class="mf">5373557.49999</span> </span><span id="L-114"><a href="#L-114"><span class="linenos" data-line="114"></span></a> <span class="kr">else</span> </span><span id="L-115"><a href="#L-115"><span class="linenos" data-line="115"></span></a> <span class="kr">return</span> </span><span id="L-116"><a href="#L-116"><span class="linenos" data-line="116"></span></a> <span class="kr">end</span> </span><span id="L-117"><a href="#L-117"><span class="linenos" data-line="117"></span></a> <span class="kd">local</span> <span class="n">jd</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">jd</span> </span><span id="L-118"><a href="#L-118"><span class="linenos" data-line="118"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">jd</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="ow">and</span> <span class="n">low</span> <span class="o"><=</span> <span class="n">jd</span> <span class="ow">and</span> <span class="n">jd</span> <span class="o"><=</span> <span class="n">high</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-119"><a href="#L-119"><span class="linenos" data-line="119"></span></a> <span class="kr">return</span> </span><span id="L-120"><a href="#L-120"><span class="linenos" data-line="120"></span></a> <span class="kr">end</span> </span><span id="L-121"><a href="#L-121"><span class="linenos" data-line="121"></span></a> <span class="kd">local</span> <span class="n">jdn</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">jd</span><span class="p">)</span> </span><span id="L-122"><a href="#L-122"><span class="linenos" data-line="122"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">hastime</span> <span class="kr">then</span> </span><span id="L-123"><a href="#L-123"><span class="linenos" data-line="123"></span></a> <span class="kd">local</span> <span class="n">time</span> <span class="o">=</span> <span class="n">jd</span> <span class="o">-</span> <span class="n">jdn</span> <span class="c1">-- 0 <= time < 1</span> </span><span id="L-124"><a href="#L-124"><span class="linenos" data-line="124"></span></a> <span class="kr">if</span> <span class="n">time</span> <span class="o">>=</span> <span class="mf">0.5</span> <span class="kr">then</span> <span class="c1">-- if at or after midnight of next day</span> </span><span id="L-125"><a href="#L-125"><span class="linenos" data-line="125"></span></a> <span class="n">jdn</span> <span class="o">=</span> <span class="n">jdn</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-126"><a href="#L-126"><span class="linenos" data-line="126"></span></a> <span class="n">time</span> <span class="o">=</span> <span class="n">time</span> <span class="o">-</span> <span class="mf">0.5</span> </span><span id="L-127"><a href="#L-127"><span class="linenos" data-line="127"></span></a> <span class="kr">else</span> </span><span id="L-128"><a href="#L-128"><span class="linenos" data-line="128"></span></a> <span class="n">time</span> <span class="o">=</span> <span class="n">time</span> <span class="o">+</span> <span class="mf">0.5</span> </span><span id="L-129"><a href="#L-129"><span class="linenos" data-line="129"></span></a> <span class="kr">end</span> </span><span id="L-130"><a href="#L-130"><span class="linenos" data-line="130"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">minute</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">h_m_s</span><span class="p">(</span><span class="n">time</span><span class="p">)</span> </span><span id="L-131"><a href="#L-131"><span class="linenos" data-line="131"></span></a> <span class="kr">else</span> </span><span id="L-132"><a href="#L-132"><span class="linenos" data-line="132"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-133"><a href="#L-133"><span class="linenos" data-line="133"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-134"><a href="#L-134"><span class="linenos" data-line="134"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-135"><a href="#L-135"><span class="linenos" data-line="135"></span></a> <span class="kr">end</span> </span><span id="L-136"><a href="#L-136"><span class="linenos" data-line="136"></span></a> <span class="kd">local</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> </span><span id="L-137"><a href="#L-137"><span class="linenos" data-line="137"></span></a> <span class="kr">if</span> <span class="n">calname</span> <span class="o">==</span> <span class="s1">'Julian'</span> <span class="kr">then</span> </span><span id="L-138"><a href="#L-138"><span class="linenos" data-line="138"></span></a> <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-139"><a href="#L-139"><span class="linenos" data-line="139"></span></a> <span class="n">c</span> <span class="o">=</span> <span class="n">jdn</span> <span class="o">+</span> <span class="mi">32082</span> </span><span id="L-140"><a href="#L-140"><span class="linenos" data-line="140"></span></a> <span class="kr">else</span> <span class="c1">-- Gregorian</span> </span><span id="L-141"><a href="#L-141"><span class="linenos" data-line="141"></span></a> <span class="kd">local</span> <span class="n">a</span> <span class="o">=</span> <span class="n">jdn</span> <span class="o">+</span> <span class="mi">32044</span> </span><span id="L-142"><a href="#L-142"><span class="linenos" data-line="142"></span></a> <span class="n">b</span> <span class="o">=</span> <span class="n">floor</span><span class="p">((</span><span class="mi">4</span><span class="o">*</span><span class="n">a</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span><span class="o">/</span><span class="mi">146097</span><span class="p">)</span> </span><span id="L-143"><a href="#L-143"><span class="linenos" data-line="143"></span></a> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">-</span> <span class="n">floor</span><span class="p">(</span><span class="mi">146097</span><span class="o">*</span><span class="n">b</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span> </span><span id="L-144"><a href="#L-144"><span class="linenos" data-line="144"></span></a> <span class="kr">end</span> </span><span id="L-145"><a href="#L-145"><span class="linenos" data-line="145"></span></a> <span class="kd">local</span> <span class="n">d</span> <span class="o">=</span> <span class="n">floor</span><span class="p">((</span><span class="mi">4</span><span class="o">*</span><span class="n">c</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span><span class="o">/</span><span class="mi">1461</span><span class="p">)</span> </span><span id="L-146"><a href="#L-146"><span class="linenos" data-line="146"></span></a> <span class="kd">local</span> <span class="n">e</span> <span class="o">=</span> <span class="n">c</span> <span class="o">-</span> <span class="n">floor</span><span class="p">(</span><span class="mi">1461</span><span class="o">*</span><span class="n">d</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span> </span><span id="L-147"><a href="#L-147"><span class="linenos" data-line="147"></span></a> <span class="kd">local</span> <span class="n">m</span> <span class="o">=</span> <span class="n">floor</span><span class="p">((</span><span class="mi">5</span><span class="o">*</span><span class="n">e</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="mi">153</span><span class="p">)</span> </span><span id="L-148"><a href="#L-148"><span class="linenos" data-line="148"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">e</span> <span class="o">-</span> <span class="n">floor</span><span class="p">((</span><span class="mi">153</span><span class="o">*</span><span class="n">m</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="mi">5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-149"><a href="#L-149"><span class="linenos" data-line="149"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">-</span> <span class="mi">12</span><span class="o">*</span><span class="n">floor</span><span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="mi">10</span><span class="p">)</span> </span><span id="L-150"><a href="#L-150"><span class="linenos" data-line="150"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="mi">100</span><span class="o">*</span><span class="n">b</span> <span class="o">+</span> <span class="n">d</span> <span class="o">-</span> <span class="mi">4800</span> <span class="o">+</span> <span class="n">floor</span><span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="mi">10</span><span class="p">)</span> </span><span id="L-151"><a href="#L-151"><span class="linenos" data-line="151"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-152"><a href="#L-152"><span class="linenos" data-line="152"></span></a><span class="kr">end</span> </span><span id="L-153"><a href="#L-153"><span class="linenos" data-line="153"></span></a> </span><span id="L-154"><a href="#L-154"><span class="linenos" data-line="154"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">fix_numbers</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">hastime</span><span class="p">,</span> <span class="n">calendar</span><span class="p">)</span> </span><span id="L-155"><a href="#L-155"><span class="linenos" data-line="155"></span></a> <span class="c1">-- Put the result of normalizing the given values in table numbers.</span> </span><span id="L-156"><a href="#L-156"><span class="linenos" data-line="156"></span></a> <span class="c1">-- The result will have valid m, d values if y is valid; caller checks y.</span> </span><span id="L-157"><a href="#L-157"><span class="linenos" data-line="157"></span></a> <span class="c1">-- The logic of PHP mktime is followed where m or d can be zero to mean</span> </span><span id="L-158"><a href="#L-158"><span class="linenos" data-line="158"></span></a> <span class="c1">-- the previous unit, and -1 is the one before that, etc.</span> </span><span id="L-159"><a href="#L-159"><span class="linenos" data-line="159"></span></a> <span class="c1">-- Positive values carry forward.</span> </span><span id="L-160"><a href="#L-160"><span class="linenos" data-line="160"></span></a> <span class="kd">local</span> <span class="n">date</span> </span><span id="L-161"><a href="#L-161"><span class="linenos" data-line="161"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><=</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">m</span> <span class="o"><=</span> <span class="mi">12</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-162"><a href="#L-162"><span class="linenos" data-line="162"></span></a> <span class="n">date</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-163"><a href="#L-163"><span class="linenos" data-line="163"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">date</span> <span class="kr">then</span> <span class="kr">return</span> <span class="kr">end</span> </span><span id="L-164"><a href="#L-164"><span class="linenos" data-line="164"></span></a> <span class="n">date</span> <span class="o">=</span> <span class="n">date</span> <span class="o">+</span> <span class="p">((</span><span class="n">m</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">..</span> <span class="s1">'m'</span><span class="p">)</span> </span><span id="L-165"><a href="#L-165"><span class="linenos" data-line="165"></span></a> <span class="n">y</span><span class="p">,</span> <span class="n">m</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> </span><span id="L-166"><a href="#L-166"><span class="linenos" data-line="166"></span></a> <span class="kr">end</span> </span><span id="L-167"><a href="#L-167"><span class="linenos" data-line="167"></span></a> <span class="kd">local</span> <span class="n">days_hms</span> </span><span id="L-168"><a href="#L-168"><span class="linenos" data-line="168"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">partial</span> <span class="kr">then</span> </span><span id="L-169"><a href="#L-169"><span class="linenos" data-line="169"></span></a> <span class="kr">if</span> <span class="n">hastime</span> <span class="ow">and</span> <span class="n">H</span> <span class="ow">and</span> <span class="n">M</span> <span class="ow">and</span> <span class="n">S</span> <span class="kr">then</span> </span><span id="L-170"><a href="#L-170"><span class="linenos" data-line="170"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">H</span> <span class="ow">and</span> <span class="n">H</span> <span class="o"><=</span> <span class="mi">23</span> <span class="ow">and</span> </span><span id="L-171"><a href="#L-171"><span class="linenos" data-line="171"></span></a> <span class="mi">0</span> <span class="o"><=</span> <span class="n">M</span> <span class="ow">and</span> <span class="n">M</span> <span class="o"><=</span> <span class="mi">59</span> <span class="ow">and</span> </span><span id="L-172"><a href="#L-172"><span class="linenos" data-line="172"></span></a> <span class="mi">0</span> <span class="o"><=</span> <span class="n">S</span> <span class="ow">and</span> <span class="n">S</span> <span class="o"><=</span> <span class="mi">59</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-173"><a href="#L-173"><span class="linenos" data-line="173"></span></a> <span class="n">days_hms</span> <span class="o">=</span> <span class="n">hms</span><span class="p">({</span> <span class="n">hour</span> <span class="o">=</span> <span class="n">H</span><span class="p">,</span> <span class="n">minute</span> <span class="o">=</span> <span class="n">M</span><span class="p">,</span> <span class="n">second</span> <span class="o">=</span> <span class="n">S</span> <span class="p">})</span> </span><span id="L-174"><a href="#L-174"><span class="linenos" data-line="174"></span></a> <span class="kr">end</span> </span><span id="L-175"><a href="#L-175"><span class="linenos" data-line="175"></span></a> <span class="kr">end</span> </span><span id="L-176"><a href="#L-176"><span class="linenos" data-line="176"></span></a> <span class="kr">if</span> <span class="n">days_hms</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><=</span> <span class="n">d</span> <span class="ow">and</span> <span class="n">d</span> <span class="o"><=</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">calendar</span><span class="p">))</span> <span class="kr">then</span> </span><span id="L-177"><a href="#L-177"><span class="linenos" data-line="177"></span></a> <span class="n">date</span> <span class="o">=</span> <span class="n">date</span> <span class="ow">or</span> <span class="n">Date</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-178"><a href="#L-178"><span class="linenos" data-line="178"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">date</span> <span class="kr">then</span> <span class="kr">return</span> <span class="kr">end</span> </span><span id="L-179"><a href="#L-179"><span class="linenos" data-line="179"></span></a> <span class="n">date</span> <span class="o">=</span> <span class="n">date</span> <span class="o">+</span> <span class="p">(</span><span class="n">d</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">+</span> <span class="p">(</span><span class="n">days_hms</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">))</span> </span><span id="L-180"><a href="#L-180"><span class="linenos" data-line="180"></span></a> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> </span><span id="L-181"><a href="#L-181"><span class="linenos" data-line="181"></span></a> <span class="kr">if</span> <span class="n">days_hms</span> <span class="kr">then</span> </span><span id="L-182"><a href="#L-182"><span class="linenos" data-line="182"></span></a> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">minute</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">second</span> </span><span id="L-183"><a href="#L-183"><span class="linenos" data-line="183"></span></a> <span class="kr">end</span> </span><span id="L-184"><a href="#L-184"><span class="linenos" data-line="184"></span></a> <span class="kr">end</span> </span><span id="L-185"><a href="#L-185"><span class="linenos" data-line="185"></span></a> <span class="kr">end</span> </span><span id="L-186"><a href="#L-186"><span class="linenos" data-line="186"></span></a> <span class="n">numbers</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">y</span> </span><span id="L-187"><a href="#L-187"><span class="linenos" data-line="187"></span></a> <span class="n">numbers</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">m</span> </span><span id="L-188"><a href="#L-188"><span class="linenos" data-line="188"></span></a> <span class="n">numbers</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">d</span> </span><span id="L-189"><a href="#L-189"><span class="linenos" data-line="189"></span></a> <span class="kr">if</span> <span class="n">days_hms</span> <span class="kr">then</span> </span><span id="L-190"><a href="#L-190"><span class="linenos" data-line="190"></span></a> <span class="c1">-- Don't set H unless it was valid because a valid H will set hastime.</span> </span><span id="L-191"><a href="#L-191"><span class="linenos" data-line="191"></span></a> <span class="n">numbers</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">H</span> </span><span id="L-192"><a href="#L-192"><span class="linenos" data-line="192"></span></a> <span class="n">numbers</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="n">M</span> </span><span id="L-193"><a href="#L-193"><span class="linenos" data-line="193"></span></a> <span class="n">numbers</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">S</span> </span><span id="L-194"><a href="#L-194"><span class="linenos" data-line="194"></span></a> <span class="kr">end</span> </span><span id="L-195"><a href="#L-195"><span class="linenos" data-line="195"></span></a><span class="kr">end</span> </span><span id="L-196"><a href="#L-196"><span class="linenos" data-line="196"></span></a> </span><span id="L-197"><a href="#L-197"><span class="linenos" data-line="197"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">set_date_from_numbers</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">numbers</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-198"><a href="#L-198"><span class="linenos" data-line="198"></span></a> <span class="c1">-- Set the fields of table date from numeric values.</span> </span><span id="L-199"><a href="#L-199"><span class="linenos" data-line="199"></span></a> <span class="c1">-- Return true if date is valid.</span> </span><span id="L-200"><a href="#L-200"><span class="linenos" data-line="200"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">numbers</span><span class="p">)</span> <span class="o">~=</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-201"><a href="#L-201"><span class="linenos" data-line="201"></span></a> <span class="kr">return</span> </span><span id="L-202"><a href="#L-202"><span class="linenos" data-line="202"></span></a> <span class="kr">end</span> </span><span id="L-203"><a href="#L-203"><span class="linenos" data-line="203"></span></a> <span class="kd">local</span> <span class="n">y</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">year</span> <span class="ow">or</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> </span><span id="L-204"><a href="#L-204"><span class="linenos" data-line="204"></span></a> <span class="kd">local</span> <span class="n">m</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">month</span> <span class="ow">or</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> </span><span id="L-205"><a href="#L-205"><span class="linenos" data-line="205"></span></a> <span class="kd">local</span> <span class="n">d</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">day</span> <span class="ow">or</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> </span><span id="L-206"><a href="#L-206"><span class="linenos" data-line="206"></span></a> <span class="kd">local</span> <span class="n">H</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">hour</span> </span><span id="L-207"><a href="#L-207"><span class="linenos" data-line="207"></span></a> <span class="kd">local</span> <span class="n">M</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">minute</span> <span class="ow">or</span> <span class="n">date</span><span class="p">.</span><span class="n">minute</span> <span class="ow">or</span> <span class="mi">0</span> </span><span id="L-208"><a href="#L-208"><span class="linenos" data-line="208"></span></a> <span class="kd">local</span> <span class="n">S</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="n">second</span> <span class="ow">or</span> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="ow">or</span> <span class="mi">0</span> </span><span id="L-209"><a href="#L-209"><span class="linenos" data-line="209"></span></a> <span class="kd">local</span> <span class="n">need_fix</span> </span><span id="L-210"><a href="#L-210"><span class="linenos" data-line="210"></span></a> <span class="kr">if</span> <span class="n">y</span> <span class="ow">and</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">d</span> <span class="kr">then</span> </span><span id="L-211"><a href="#L-211"><span class="linenos" data-line="211"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-212"><a href="#L-212"><span class="linenos" data-line="212"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="o">-</span><span class="mi">9999</span> <span class="o"><=</span> <span class="n">y</span> <span class="ow">and</span> <span class="n">y</span> <span class="o"><=</span> <span class="mi">9999</span> <span class="ow">and</span> </span><span id="L-213"><a href="#L-213"><span class="linenos" data-line="213"></span></a> <span class="mi">1</span> <span class="o"><=</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">m</span> <span class="o"><=</span> <span class="mi">12</span> <span class="ow">and</span> </span><span id="L-214"><a href="#L-214"><span class="linenos" data-line="214"></span></a> <span class="mi">1</span> <span class="o"><=</span> <span class="n">d</span> <span class="ow">and</span> <span class="n">d</span> <span class="o"><=</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">calendar</span><span class="p">))</span> <span class="kr">then</span> </span><span id="L-215"><a href="#L-215"><span class="linenos" data-line="215"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">date</span><span class="p">.</span><span class="n">want_fix</span> <span class="kr">then</span> </span><span id="L-216"><a href="#L-216"><span class="linenos" data-line="216"></span></a> <span class="kr">return</span> </span><span id="L-217"><a href="#L-217"><span class="linenos" data-line="217"></span></a> <span class="kr">end</span> </span><span id="L-218"><a href="#L-218"><span class="linenos" data-line="218"></span></a> <span class="n">need_fix</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-219"><a href="#L-219"><span class="linenos" data-line="219"></span></a> <span class="kr">end</span> </span><span id="L-220"><a href="#L-220"><span class="linenos" data-line="220"></span></a> <span class="kr">elseif</span> <span class="n">y</span> <span class="ow">and</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-221"><a href="#L-221"><span class="linenos" data-line="221"></span></a> <span class="kr">if</span> <span class="n">d</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="o">-</span><span class="mi">9999</span> <span class="o"><=</span> <span class="n">y</span> <span class="ow">and</span> <span class="n">y</span> <span class="o"><=</span> <span class="mi">9999</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-222"><a href="#L-222"><span class="linenos" data-line="222"></span></a> <span class="kr">return</span> </span><span id="L-223"><a href="#L-223"><span class="linenos" data-line="223"></span></a> <span class="kr">end</span> </span><span id="L-224"><a href="#L-224"><span class="linenos" data-line="224"></span></a> <span class="kr">if</span> <span class="n">m</span> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><=</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">m</span> <span class="o"><=</span> <span class="mi">12</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-225"><a href="#L-225"><span class="linenos" data-line="225"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">date</span><span class="p">.</span><span class="n">want_fix</span> <span class="kr">then</span> </span><span id="L-226"><a href="#L-226"><span class="linenos" data-line="226"></span></a> <span class="kr">return</span> </span><span id="L-227"><a href="#L-227"><span class="linenos" data-line="227"></span></a> <span class="kr">end</span> </span><span id="L-228"><a href="#L-228"><span class="linenos" data-line="228"></span></a> <span class="n">need_fix</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-229"><a href="#L-229"><span class="linenos" data-line="229"></span></a> <span class="kr">end</span> </span><span id="L-230"><a href="#L-230"><span class="linenos" data-line="230"></span></a> <span class="kr">else</span> </span><span id="L-231"><a href="#L-231"><span class="linenos" data-line="231"></span></a> <span class="kr">return</span> </span><span id="L-232"><a href="#L-232"><span class="linenos" data-line="232"></span></a> <span class="kr">end</span> </span><span id="L-233"><a href="#L-233"><span class="linenos" data-line="233"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-234"><a href="#L-234"><span class="linenos" data-line="234"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="kc">nil</span> <span class="c1">-- ignore any time</span> </span><span id="L-235"><a href="#L-235"><span class="linenos" data-line="235"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-236"><a href="#L-236"><span class="linenos" data-line="236"></span></a> <span class="n">S</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-237"><a href="#L-237"><span class="linenos" data-line="237"></span></a> <span class="kr">else</span> </span><span id="L-238"><a href="#L-238"><span class="linenos" data-line="238"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="kr">then</span> </span><span id="L-239"><a href="#L-239"><span class="linenos" data-line="239"></span></a> <span class="c1">-- It is not possible to set M or S without also setting H.</span> </span><span id="L-240"><a href="#L-240"><span class="linenos" data-line="240"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hastime</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-241"><a href="#L-241"><span class="linenos" data-line="241"></span></a> <span class="kr">else</span> </span><span id="L-242"><a href="#L-242"><span class="linenos" data-line="242"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-243"><a href="#L-243"><span class="linenos" data-line="243"></span></a> <span class="kr">end</span> </span><span id="L-244"><a href="#L-244"><span class="linenos" data-line="244"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">H</span> <span class="ow">and</span> <span class="n">H</span> <span class="o"><=</span> <span class="mi">23</span> <span class="ow">and</span> </span><span id="L-245"><a href="#L-245"><span class="linenos" data-line="245"></span></a> <span class="mi">0</span> <span class="o"><=</span> <span class="n">M</span> <span class="ow">and</span> <span class="n">M</span> <span class="o"><=</span> <span class="mi">59</span> <span class="ow">and</span> </span><span id="L-246"><a href="#L-246"><span class="linenos" data-line="246"></span></a> <span class="mi">0</span> <span class="o"><=</span> <span class="n">S</span> <span class="ow">and</span> <span class="n">S</span> <span class="o"><=</span> <span class="mi">59</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-247"><a href="#L-247"><span class="linenos" data-line="247"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">want_fix</span> <span class="kr">then</span> </span><span id="L-248"><a href="#L-248"><span class="linenos" data-line="248"></span></a> <span class="n">need_fix</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-249"><a href="#L-249"><span class="linenos" data-line="249"></span></a> <span class="kr">else</span> </span><span id="L-250"><a href="#L-250"><span class="linenos" data-line="250"></span></a> <span class="kr">return</span> </span><span id="L-251"><a href="#L-251"><span class="linenos" data-line="251"></span></a> <span class="kr">end</span> </span><span id="L-252"><a href="#L-252"><span class="linenos" data-line="252"></span></a> <span class="kr">end</span> </span><span id="L-253"><a href="#L-253"><span class="linenos" data-line="253"></span></a> <span class="kr">end</span> </span><span id="L-254"><a href="#L-254"><span class="linenos" data-line="254"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">want_fix</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-255"><a href="#L-255"><span class="linenos" data-line="255"></span></a> <span class="kr">if</span> <span class="n">need_fix</span> <span class="kr">then</span> </span><span id="L-256"><a href="#L-256"><span class="linenos" data-line="256"></span></a> <span class="n">fix_numbers</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">hastime</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> </span><span id="L-257"><a href="#L-257"><span class="linenos" data-line="257"></span></a> <span class="kr">return</span> <span class="n">set_date_from_numbers</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">numbers</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-258"><a href="#L-258"><span class="linenos" data-line="258"></span></a> <span class="kr">end</span> </span><span id="L-259"><a href="#L-259"><span class="linenos" data-line="259"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">y</span> <span class="c1">-- -9999 to 9999 ('n BC' → year = 1 - n)</span> </span><span id="L-260"><a href="#L-260"><span class="linenos" data-line="260"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">m</span> <span class="c1">-- 1 to 12 (may be nil if partial)</span> </span><span id="L-261"><a href="#L-261"><span class="linenos" data-line="261"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">d</span> <span class="c1">-- 1 to 31 (* = nil if partial)</span> </span><span id="L-262"><a href="#L-262"><span class="linenos" data-line="262"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">H</span> <span class="c1">-- 0 to 59 (*)</span> </span><span id="L-263"><a href="#L-263"><span class="linenos" data-line="263"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="n">M</span> <span class="c1">-- 0 to 59 (*)</span> </span><span id="L-264"><a href="#L-264"><span class="linenos" data-line="264"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">S</span> <span class="c1">-- 0 to 59 (*)</span> </span><span id="L-265"><a href="#L-265"><span class="linenos" data-line="265"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-266"><a href="#L-266"><span class="linenos" data-line="266"></span></a> <span class="kr">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">k</span> <span class="kr">in</span> <span class="nb">ipairs</span><span class="p">({</span> <span class="s1">'am'</span><span class="p">,</span> <span class="s1">'era'</span><span class="p">,</span> <span class="s1">'format'</span> <span class="p">})</span> <span class="kr">do</span> </span><span id="L-267"><a href="#L-267"><span class="linenos" data-line="267"></span></a> <span class="kr">if</span> <span class="n">options</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-268"><a href="#L-268"><span class="linenos" data-line="268"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">options</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">options</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-269"><a href="#L-269"><span class="linenos" data-line="269"></span></a> <span class="kr">end</span> </span><span id="L-270"><a href="#L-270"><span class="linenos" data-line="270"></span></a> <span class="kr">end</span> </span><span id="L-271"><a href="#L-271"><span class="linenos" data-line="271"></span></a> <span class="kr">end</span> </span><span id="L-272"><a href="#L-272"><span class="linenos" data-line="272"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-273"><a href="#L-273"><span class="linenos" data-line="273"></span></a><span class="kr">end</span> </span><span id="L-274"><a href="#L-274"><span class="linenos" data-line="274"></span></a> </span><span id="L-275"><a href="#L-275"><span class="linenos" data-line="275"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">make_option_table</span><span class="p">(</span><span class="n">options1</span><span class="p">,</span> <span class="n">options2</span><span class="p">)</span> </span><span id="L-276"><a href="#L-276"><span class="linenos" data-line="276"></span></a> <span class="c1">-- If options1 is a string, return a table with its settings, or</span> </span><span id="L-277"><a href="#L-277"><span class="linenos" data-line="277"></span></a> <span class="c1">-- if it is a table, use its settings.</span> </span><span id="L-278"><a href="#L-278"><span class="linenos" data-line="278"></span></a> <span class="c1">-- Missing options are set from table options2 or defaults.</span> </span><span id="L-279"><a href="#L-279"><span class="linenos" data-line="279"></span></a> <span class="c1">-- If a default is used, a flag is set so caller knows the value was not intentionally set.</span> </span><span id="L-280"><a href="#L-280"><span class="linenos" data-line="280"></span></a> <span class="c1">-- Valid option settings are:</span> </span><span id="L-281"><a href="#L-281"><span class="linenos" data-line="281"></span></a> <span class="c1">-- am: 'am', 'a.m.', 'AM', 'A.M.'</span> </span><span id="L-282"><a href="#L-282"><span class="linenos" data-line="282"></span></a> <span class="c1">-- 'pm', 'p.m.', 'PM', 'P.M.' (each has same meaning as corresponding item above)</span> </span><span id="L-283"><a href="#L-283"><span class="linenos" data-line="283"></span></a> <span class="c1">-- era: 'BCMINUS', 'BCNEGATIVE', 'BC', 'B.C.', 'BCE', 'B.C.E.', 'AD', 'A.D.', 'CE', 'C.E.'</span> </span><span id="L-284"><a href="#L-284"><span class="linenos" data-line="284"></span></a> <span class="c1">-- Option am = 'am' does not mean the hour is AM; it means 'am' or 'pm' is used, depending on the hour,</span> </span><span id="L-285"><a href="#L-285"><span class="linenos" data-line="285"></span></a> <span class="c1">-- and am = 'pm' has the same meaning.</span> </span><span id="L-286"><a href="#L-286"><span class="linenos" data-line="286"></span></a> <span class="c1">-- Similarly, era = 'BC' means 'BC' is used if year <= 0.</span> </span><span id="L-287"><a href="#L-287"><span class="linenos" data-line="287"></span></a> <span class="c1">-- BCMINUS displays a MINUS if year < 0 and the display format does not include %{era}.</span> </span><span id="L-288"><a href="#L-288"><span class="linenos" data-line="288"></span></a> <span class="c1">-- BCNEGATIVE is similar but displays a hyphen.</span> </span><span id="L-289"><a href="#L-289"><span class="linenos" data-line="289"></span></a> <span class="kd">local</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{</span> <span class="n">bydefault</span> <span class="o">=</span> <span class="p">{}</span> <span class="p">}</span> </span><span id="L-290"><a href="#L-290"><span class="linenos" data-line="290"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">options1</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-291"><a href="#L-291"><span class="linenos" data-line="291"></span></a> <span class="n">result</span><span class="p">.</span><span class="n">am</span> <span class="o">=</span> <span class="n">options1</span><span class="p">.</span><span class="n">am</span> </span><span id="L-292"><a href="#L-292"><span class="linenos" data-line="292"></span></a> <span class="n">result</span><span class="p">.</span><span class="n">era</span> <span class="o">=</span> <span class="n">options1</span><span class="p">.</span><span class="n">era</span> </span><span id="L-293"><a href="#L-293"><span class="linenos" data-line="293"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">options1</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-294"><a href="#L-294"><span class="linenos" data-line="294"></span></a> <span class="c1">-- Example: 'am:AM era:BC' or 'am=AM era=BC'.</span> </span><span id="L-295"><a href="#L-295"><span class="linenos" data-line="295"></span></a> <span class="kr">for</span> <span class="n">item</span> <span class="kr">in</span> <span class="n">options1</span><span class="p">:</span><span class="n">gmatch</span><span class="p">(</span><span class="s1">'%S+'</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-296"><a href="#L-296"><span class="linenos" data-line="296"></span></a> <span class="kd">local</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="o">=</span> <span class="n">item</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^(%w+)[:=](.+)$'</span><span class="p">)</span> </span><span id="L-297"><a href="#L-297"><span class="linenos" data-line="297"></span></a> <span class="kr">if</span> <span class="n">lhs</span> <span class="kr">then</span> </span><span id="L-298"><a href="#L-298"><span class="linenos" data-line="298"></span></a> <span class="n">result</span><span class="p">[</span><span class="n">lhs</span><span class="p">]</span> <span class="o">=</span> <span class="n">rhs</span> </span><span id="L-299"><a href="#L-299"><span class="linenos" data-line="299"></span></a> <span class="kr">end</span> </span><span id="L-300"><a href="#L-300"><span class="linenos" data-line="300"></span></a> <span class="kr">end</span> </span><span id="L-301"><a href="#L-301"><span class="linenos" data-line="301"></span></a> <span class="kr">end</span> </span><span id="L-302"><a href="#L-302"><span class="linenos" data-line="302"></span></a> <span class="n">options2</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">options2</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="ow">and</span> <span class="n">options2</span> <span class="ow">or</span> <span class="p">{}</span> </span><span id="L-303"><a href="#L-303"><span class="linenos" data-line="303"></span></a> <span class="kd">local</span> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span> <span class="n">am</span> <span class="o">=</span> <span class="s1">'am'</span><span class="p">,</span> <span class="n">era</span> <span class="o">=</span> <span class="s1">'BC'</span> <span class="p">}</span> </span><span id="L-304"><a href="#L-304"><span class="linenos" data-line="304"></span></a> <span class="kr">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">defaults</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-305"><a href="#L-305"><span class="linenos" data-line="305"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">result</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-306"><a href="#L-306"><span class="linenos" data-line="306"></span></a> <span class="kr">if</span> <span class="n">options2</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-307"><a href="#L-307"><span class="linenos" data-line="307"></span></a> <span class="n">result</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">options2</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-308"><a href="#L-308"><span class="linenos" data-line="308"></span></a> <span class="kr">else</span> </span><span id="L-309"><a href="#L-309"><span class="linenos" data-line="309"></span></a> <span class="n">result</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-310"><a href="#L-310"><span class="linenos" data-line="310"></span></a> <span class="n">result</span><span class="p">.</span><span class="n">bydefault</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-311"><a href="#L-311"><span class="linenos" data-line="311"></span></a> <span class="kr">end</span> </span><span id="L-312"><a href="#L-312"><span class="linenos" data-line="312"></span></a> <span class="kr">end</span> </span><span id="L-313"><a href="#L-313"><span class="linenos" data-line="313"></span></a> <span class="kr">end</span> </span><span id="L-314"><a href="#L-314"><span class="linenos" data-line="314"></span></a> <span class="kr">return</span> <span class="n">result</span> </span><span id="L-315"><a href="#L-315"><span class="linenos" data-line="315"></span></a><span class="kr">end</span> </span><span id="L-316"><a href="#L-316"><span class="linenos" data-line="316"></span></a> </span><span id="L-317"><a href="#L-317"><span class="linenos" data-line="317"></span></a><span class="kd">local</span> <span class="n">ampm_options</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-318"><a href="#L-318"><span class="linenos" data-line="318"></span></a> <span class="c1">-- lhs = input text accepted as an am/pm option</span> </span><span id="L-319"><a href="#L-319"><span class="linenos" data-line="319"></span></a> <span class="c1">-- rhs = code used internally</span> </span><span id="L-320"><a href="#L-320"><span class="linenos" data-line="320"></span></a> <span class="p">[</span><span class="s1">'am'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'am'</span><span class="p">,</span> </span><span id="L-321"><a href="#L-321"><span class="linenos" data-line="321"></span></a> <span class="p">[</span><span class="s1">'AM'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'AM'</span><span class="p">,</span> </span><span id="L-322"><a href="#L-322"><span class="linenos" data-line="322"></span></a> <span class="p">[</span><span class="s1">'a.m.'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'a.m.'</span><span class="p">,</span> </span><span id="L-323"><a href="#L-323"><span class="linenos" data-line="323"></span></a> <span class="p">[</span><span class="s1">'A.M.'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'A.M.'</span><span class="p">,</span> </span><span id="L-324"><a href="#L-324"><span class="linenos" data-line="324"></span></a> <span class="p">[</span><span class="s1">'pm'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'am'</span><span class="p">,</span> <span class="c1">-- same as am</span> </span><span id="L-325"><a href="#L-325"><span class="linenos" data-line="325"></span></a> <span class="p">[</span><span class="s1">'PM'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'AM'</span><span class="p">,</span> </span><span id="L-326"><a href="#L-326"><span class="linenos" data-line="326"></span></a> <span class="p">[</span><span class="s1">'p.m.'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'a.m.'</span><span class="p">,</span> </span><span id="L-327"><a href="#L-327"><span class="linenos" data-line="327"></span></a> <span class="p">[</span><span class="s1">'P.M.'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'A.M.'</span><span class="p">,</span> </span><span id="L-328"><a href="#L-328"><span class="linenos" data-line="328"></span></a><span class="p">}</span> </span><span id="L-329"><a href="#L-329"><span class="linenos" data-line="329"></span></a> </span><span id="L-330"><a href="#L-330"><span class="linenos" data-line="330"></span></a><span class="kd">local</span> <span class="n">era_text</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-331"><a href="#L-331"><span class="linenos" data-line="331"></span></a> <span class="c1">-- Text for displaying an era with a positive year (after adjusting</span> </span><span id="L-332"><a href="#L-332"><span class="linenos" data-line="332"></span></a> <span class="c1">-- by replacing year with 1 - year if date.year <= 0).</span> </span><span id="L-333"><a href="#L-333"><span class="linenos" data-line="333"></span></a> <span class="c1">-- options.era = { year<=0 , year>0 }</span> </span><span id="L-334"><a href="#L-334"><span class="linenos" data-line="334"></span></a> <span class="p">[</span><span class="s1">'BCMINUS'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'BC'</span> <span class="p">,</span> <span class="s1">''</span> <span class="p">,</span> <span class="n">isbc</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="n">sign</span> <span class="o">=</span> <span class="n">MINUS</span> <span class="p">},</span> </span><span id="L-335"><a href="#L-335"><span class="linenos" data-line="335"></span></a> <span class="p">[</span><span class="s1">'BCNEGATIVE'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'BC'</span> <span class="p">,</span> <span class="s1">''</span> <span class="p">,</span> <span class="n">isbc</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="n">sign</span> <span class="o">=</span> <span class="s1">'-'</span> <span class="p">},</span> </span><span id="L-336"><a href="#L-336"><span class="linenos" data-line="336"></span></a> <span class="p">[</span><span class="s1">'BC'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'BC'</span> <span class="p">,</span> <span class="s1">''</span> <span class="p">,</span> <span class="n">isbc</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">},</span> </span><span id="L-337"><a href="#L-337"><span class="linenos" data-line="337"></span></a> <span class="p">[</span><span class="s1">'B.C.'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'B.C.'</span> <span class="p">,</span> <span class="s1">''</span> <span class="p">,</span> <span class="n">isbc</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">},</span> </span><span id="L-338"><a href="#L-338"><span class="linenos" data-line="338"></span></a> <span class="p">[</span><span class="s1">'BCE'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'BCE'</span> <span class="p">,</span> <span class="s1">''</span> <span class="p">,</span> <span class="n">isbc</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">},</span> </span><span id="L-339"><a href="#L-339"><span class="linenos" data-line="339"></span></a> <span class="p">[</span><span class="s1">'B.C.E.'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'B.C.E.'</span><span class="p">,</span> <span class="s1">''</span> <span class="p">,</span> <span class="n">isbc</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">},</span> </span><span id="L-340"><a href="#L-340"><span class="linenos" data-line="340"></span></a> <span class="p">[</span><span class="s1">'AD'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'BC'</span> <span class="p">,</span> <span class="s1">'AD'</span> <span class="p">},</span> </span><span id="L-341"><a href="#L-341"><span class="linenos" data-line="341"></span></a> <span class="p">[</span><span class="s1">'A.D.'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'B.C.'</span> <span class="p">,</span> <span class="s1">'A.D.'</span> <span class="p">},</span> </span><span id="L-342"><a href="#L-342"><span class="linenos" data-line="342"></span></a> <span class="p">[</span><span class="s1">'CE'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'BCE'</span> <span class="p">,</span> <span class="s1">'CE'</span> <span class="p">},</span> </span><span id="L-343"><a href="#L-343"><span class="linenos" data-line="343"></span></a> <span class="p">[</span><span class="s1">'C.E.'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'B.C.E.'</span><span class="p">,</span> <span class="s1">'C.E.'</span> <span class="p">},</span> </span><span id="L-344"><a href="#L-344"><span class="linenos" data-line="344"></span></a><span class="p">}</span> </span><span id="L-345"><a href="#L-345"><span class="linenos" data-line="345"></span></a> </span><span id="L-346"><a href="#L-346"><span class="linenos" data-line="346"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_era_for_year</span><span class="p">(</span><span class="n">era</span><span class="p">,</span> <span class="n">year</span><span class="p">)</span> </span><span id="L-347"><a href="#L-347"><span class="linenos" data-line="347"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">era_text</span><span class="p">[</span><span class="n">era</span><span class="p">]</span> <span class="ow">or</span> <span class="n">era_text</span><span class="p">[</span><span class="s1">'BC'</span><span class="p">])[</span><span class="n">year</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">and</span> <span class="mi">2</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">''</span> </span><span id="L-348"><a href="#L-348"><span class="linenos" data-line="348"></span></a><span class="kr">end</span> </span><span id="L-349"><a href="#L-349"><span class="linenos" data-line="349"></span></a> </span><span id="L-350"><a href="#L-350"><span class="linenos" data-line="350"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">strftime</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">format</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-351"><a href="#L-351"><span class="linenos" data-line="351"></span></a> <span class="c1">-- Return date formatted as a string using codes similar to those</span> </span><span id="L-352"><a href="#L-352"><span class="linenos" data-line="352"></span></a> <span class="c1">-- in the C strftime library function.</span> </span><span id="L-353"><a href="#L-353"><span class="linenos" data-line="353"></span></a> <span class="kd">local</span> <span class="n">sformat</span> <span class="o">=</span> <span class="nb">string.format</span> </span><span id="L-354"><a href="#L-354"><span class="linenos" data-line="354"></span></a> <span class="kd">local</span> <span class="n">shortcuts</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-355"><a href="#L-355"><span class="linenos" data-line="355"></span></a> <span class="p">[</span><span class="s1">'%c'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'%-I:%M %p %-d %B %-Y %{era}'</span><span class="p">,</span> <span class="c1">-- date and time: 2:30 pm 1 April 2016</span> </span><span id="L-356"><a href="#L-356"><span class="linenos" data-line="356"></span></a> <span class="p">[</span><span class="s1">'%x'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'%-d %B %-Y %{era}'</span><span class="p">,</span> <span class="c1">-- date: 1 April 2016</span> </span><span id="L-357"><a href="#L-357"><span class="linenos" data-line="357"></span></a> <span class="p">[</span><span class="s1">'%X'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'%-I:%M %p'</span><span class="p">,</span> <span class="c1">-- time: 2:30 pm</span> </span><span id="L-358"><a href="#L-358"><span class="linenos" data-line="358"></span></a> <span class="p">}</span> </span><span id="L-359"><a href="#L-359"><span class="linenos" data-line="359"></span></a> <span class="kr">if</span> <span class="n">shortcuts</span><span class="p">[</span><span class="n">format</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-360"><a href="#L-360"><span class="linenos" data-line="360"></span></a> <span class="n">format</span> <span class="o">=</span> <span class="n">shortcuts</span><span class="p">[</span><span class="n">format</span><span class="p">]</span> </span><span id="L-361"><a href="#L-361"><span class="linenos" data-line="361"></span></a> <span class="kr">end</span> </span><span id="L-362"><a href="#L-362"><span class="linenos" data-line="362"></span></a> <span class="kd">local</span> <span class="n">codes</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-363"><a href="#L-363"><span class="linenos" data-line="363"></span></a> <span class="n">a</span> <span class="o">=</span> <span class="p">{</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'dayabbr'</span> <span class="p">},</span> </span><span id="L-364"><a href="#L-364"><span class="linenos" data-line="364"></span></a> <span class="n">A</span> <span class="o">=</span> <span class="p">{</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'dayname'</span> <span class="p">},</span> </span><span id="L-365"><a href="#L-365"><span class="linenos" data-line="365"></span></a> <span class="n">b</span> <span class="o">=</span> <span class="p">{</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'monthabbr'</span> <span class="p">},</span> </span><span id="L-366"><a href="#L-366"><span class="linenos" data-line="366"></span></a> <span class="n">B</span> <span class="o">=</span> <span class="p">{</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'monthname'</span> <span class="p">},</span> </span><span id="L-367"><a href="#L-367"><span class="linenos" data-line="367"></span></a> <span class="n">u</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%d'</span> <span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'dowiso'</span> <span class="p">},</span> </span><span id="L-368"><a href="#L-368"><span class="linenos" data-line="368"></span></a> <span class="n">w</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%d'</span> <span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'dow'</span> <span class="p">},</span> </span><span id="L-369"><a href="#L-369"><span class="linenos" data-line="369"></span></a> <span class="n">d</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%02d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'day'</span> <span class="p">},</span> </span><span id="L-370"><a href="#L-370"><span class="linenos" data-line="370"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%02d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'month'</span> <span class="p">},</span> </span><span id="L-371"><a href="#L-371"><span class="linenos" data-line="371"></span></a> <span class="n">Y</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%04d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'year'</span> <span class="p">},</span> </span><span id="L-372"><a href="#L-372"><span class="linenos" data-line="372"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%02d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'hour'</span> <span class="p">},</span> </span><span id="L-373"><a href="#L-373"><span class="linenos" data-line="373"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%02d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'minute'</span> <span class="p">},</span> </span><span id="L-374"><a href="#L-374"><span class="linenos" data-line="374"></span></a> <span class="n">S</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%02d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'second'</span> <span class="p">},</span> </span><span id="L-375"><a href="#L-375"><span class="linenos" data-line="375"></span></a> <span class="n">j</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%03d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'dayofyear'</span> <span class="p">},</span> </span><span id="L-376"><a href="#L-376"><span class="linenos" data-line="376"></span></a> <span class="n">I</span> <span class="o">=</span> <span class="p">{</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'%02d'</span><span class="p">,</span> <span class="n">fmt2</span> <span class="o">=</span> <span class="s1">'%d'</span><span class="p">,</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'hour'</span><span class="p">,</span> <span class="n">special</span> <span class="o">=</span> <span class="s1">'hour12'</span> <span class="p">},</span> </span><span id="L-377"><a href="#L-377"><span class="linenos" data-line="377"></span></a> <span class="n">p</span> <span class="o">=</span> <span class="p">{</span> <span class="n">field</span> <span class="o">=</span> <span class="s1">'hour'</span><span class="p">,</span> <span class="n">special</span> <span class="o">=</span> <span class="s1">'am'</span> <span class="p">},</span> </span><span id="L-378"><a href="#L-378"><span class="linenos" data-line="378"></span></a> <span class="p">}</span> </span><span id="L-379"><a href="#L-379"><span class="linenos" data-line="379"></span></a> <span class="n">options</span> <span class="o">=</span> <span class="n">make_option_table</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">options</span><span class="p">)</span> </span><span id="L-380"><a href="#L-380"><span class="linenos" data-line="380"></span></a> <span class="kd">local</span> <span class="n">amopt</span> <span class="o">=</span> <span class="n">options</span><span class="p">.</span><span class="n">am</span> </span><span id="L-381"><a href="#L-381"><span class="linenos" data-line="381"></span></a> <span class="kd">local</span> <span class="n">eraopt</span> <span class="o">=</span> <span class="n">options</span><span class="p">.</span><span class="n">era</span> </span><span id="L-382"><a href="#L-382"><span class="linenos" data-line="382"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">replace_code</span><span class="p">(</span><span class="n">spaces</span><span class="p">,</span> <span class="n">modifier</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span> </span><span id="L-383"><a href="#L-383"><span class="linenos" data-line="383"></span></a> <span class="kd">local</span> <span class="n">code</span> <span class="o">=</span> <span class="n">codes</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> </span><span id="L-384"><a href="#L-384"><span class="linenos" data-line="384"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="kr">then</span> </span><span id="L-385"><a href="#L-385"><span class="linenos" data-line="385"></span></a> <span class="kd">local</span> <span class="n">fmt</span> <span class="o">=</span> <span class="n">code</span><span class="p">.</span><span class="n">fmt</span> </span><span id="L-386"><a href="#L-386"><span class="linenos" data-line="386"></span></a> <span class="kr">if</span> <span class="n">modifier</span> <span class="o">==</span> <span class="s1">'-'</span> <span class="ow">and</span> <span class="n">code</span><span class="p">.</span><span class="n">fmt2</span> <span class="kr">then</span> </span><span id="L-387"><a href="#L-387"><span class="linenos" data-line="387"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">code</span><span class="p">.</span><span class="n">fmt2</span> </span><span id="L-388"><a href="#L-388"><span class="linenos" data-line="388"></span></a> <span class="kr">end</span> </span><span id="L-389"><a href="#L-389"><span class="linenos" data-line="389"></span></a> <span class="kd">local</span> <span class="n">value</span> <span class="o">=</span> <span class="n">date</span><span class="p">[</span><span class="n">code</span><span class="p">.</span><span class="n">field</span><span class="p">]</span> </span><span id="L-390"><a href="#L-390"><span class="linenos" data-line="390"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">value</span> <span class="kr">then</span> </span><span id="L-391"><a href="#L-391"><span class="linenos" data-line="391"></span></a> <span class="kr">return</span> <span class="kc">nil</span> <span class="c1">-- an undefined field in a partial date</span> </span><span id="L-392"><a href="#L-392"><span class="linenos" data-line="392"></span></a> <span class="kr">end</span> </span><span id="L-393"><a href="#L-393"><span class="linenos" data-line="393"></span></a> <span class="kd">local</span> <span class="n">special</span> <span class="o">=</span> <span class="n">code</span><span class="p">.</span><span class="n">special</span> </span><span id="L-394"><a href="#L-394"><span class="linenos" data-line="394"></span></a> <span class="kr">if</span> <span class="n">special</span> <span class="kr">then</span> </span><span id="L-395"><a href="#L-395"><span class="linenos" data-line="395"></span></a> <span class="kr">if</span> <span class="n">special</span> <span class="o">==</span> <span class="s1">'hour12'</span> <span class="kr">then</span> </span><span id="L-396"><a href="#L-396"><span class="linenos" data-line="396"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">value</span> <span class="o">%</span> <span class="mi">12</span> </span><span id="L-397"><a href="#L-397"><span class="linenos" data-line="397"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">value</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="mi">12</span> <span class="ow">or</span> <span class="n">value</span> </span><span id="L-398"><a href="#L-398"><span class="linenos" data-line="398"></span></a> <span class="kr">elseif</span> <span class="n">special</span> <span class="o">==</span> <span class="s1">'am'</span> <span class="kr">then</span> </span><span id="L-399"><a href="#L-399"><span class="linenos" data-line="399"></span></a> <span class="kd">local</span> <span class="n">ap</span> <span class="o">=</span> <span class="p">({</span> </span><span id="L-400"><a href="#L-400"><span class="linenos" data-line="400"></span></a> <span class="p">[</span><span class="s1">'a.m.'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'a.m.'</span><span class="p">,</span> <span class="s1">'p.m.'</span> <span class="p">},</span> </span><span id="L-401"><a href="#L-401"><span class="linenos" data-line="401"></span></a> <span class="p">[</span><span class="s1">'AM'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'AM'</span><span class="p">,</span> <span class="s1">'PM'</span> <span class="p">},</span> </span><span id="L-402"><a href="#L-402"><span class="linenos" data-line="402"></span></a> <span class="p">[</span><span class="s1">'A.M.'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'A.M.'</span><span class="p">,</span> <span class="s1">'P.M.'</span> <span class="p">},</span> </span><span id="L-403"><a href="#L-403"><span class="linenos" data-line="403"></span></a> <span class="p">})[</span><span class="n">ampm_options</span><span class="p">[</span><span class="n">amopt</span><span class="p">]]</span> <span class="ow">or</span> <span class="p">{</span> <span class="s1">'am'</span><span class="p">,</span> <span class="s1">'pm'</span> <span class="p">}</span> </span><span id="L-404"><a href="#L-404"><span class="linenos" data-line="404"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">spaces</span> <span class="o">==</span> <span class="s1">''</span> <span class="ow">and</span> <span class="s1">''</span> <span class="ow">or</span> <span class="s1">'&nbsp;'</span><span class="p">)</span> <span class="o">..</span> <span class="p">(</span><span class="n">value</span> <span class="o"><</span> <span class="mi">12</span> <span class="ow">and</span> <span class="n">ap</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="n">ap</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> </span><span id="L-405"><a href="#L-405"><span class="linenos" data-line="405"></span></a> <span class="kr">end</span> </span><span id="L-406"><a href="#L-406"><span class="linenos" data-line="406"></span></a> <span class="kr">end</span> </span><span id="L-407"><a href="#L-407"><span class="linenos" data-line="407"></span></a> <span class="kr">if</span> <span class="n">code</span><span class="p">.</span><span class="n">field</span> <span class="o">==</span> <span class="s1">'year'</span> <span class="kr">then</span> </span><span id="L-408"><a href="#L-408"><span class="linenos" data-line="408"></span></a> <span class="kd">local</span> <span class="n">sign</span> <span class="o">=</span> <span class="p">(</span><span class="n">era_text</span><span class="p">[</span><span class="n">eraopt</span><span class="p">]</span> <span class="ow">or</span> <span class="p">{}).</span><span class="n">sign</span> </span><span id="L-409"><a href="#L-409"><span class="linenos" data-line="409"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">sign</span> <span class="ow">or</span> <span class="n">format</span><span class="p">:</span><span class="n">find</span><span class="p">(</span><span class="s1">'%{era}'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-410"><a href="#L-410"><span class="linenos" data-line="410"></span></a> <span class="n">sign</span> <span class="o">=</span> <span class="s1">''</span> </span><span id="L-411"><a href="#L-411"><span class="linenos" data-line="411"></span></a> <span class="kr">if</span> <span class="n">value</span> <span class="o"><=</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-412"><a href="#L-412"><span class="linenos" data-line="412"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">value</span> </span><span id="L-413"><a href="#L-413"><span class="linenos" data-line="413"></span></a> <span class="kr">end</span> </span><span id="L-414"><a href="#L-414"><span class="linenos" data-line="414"></span></a> <span class="kr">else</span> </span><span id="L-415"><a href="#L-415"><span class="linenos" data-line="415"></span></a> <span class="kr">if</span> <span class="n">value</span> <span class="o">>=</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-416"><a href="#L-416"><span class="linenos" data-line="416"></span></a> <span class="n">sign</span> <span class="o">=</span> <span class="s1">''</span> </span><span id="L-417"><a href="#L-417"><span class="linenos" data-line="417"></span></a> <span class="kr">else</span> </span><span id="L-418"><a href="#L-418"><span class="linenos" data-line="418"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="o">-</span><span class="n">value</span> </span><span id="L-419"><a href="#L-419"><span class="linenos" data-line="419"></span></a> <span class="kr">end</span> </span><span id="L-420"><a href="#L-420"><span class="linenos" data-line="420"></span></a> <span class="kr">end</span> </span><span id="L-421"><a href="#L-421"><span class="linenos" data-line="421"></span></a> <span class="kr">return</span> <span class="n">spaces</span> <span class="o">..</span> <span class="n">sign</span> <span class="o">..</span> <span class="n">sformat</span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> </span><span id="L-422"><a href="#L-422"><span class="linenos" data-line="422"></span></a> <span class="kr">end</span> </span><span id="L-423"><a href="#L-423"><span class="linenos" data-line="423"></span></a> <span class="kr">return</span> <span class="n">spaces</span> <span class="o">..</span> <span class="p">(</span><span class="n">fmt</span> <span class="ow">and</span> <span class="n">sformat</span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="ow">or</span> <span class="n">value</span><span class="p">)</span> </span><span id="L-424"><a href="#L-424"><span class="linenos" data-line="424"></span></a> <span class="kr">end</span> </span><span id="L-425"><a href="#L-425"><span class="linenos" data-line="425"></span></a> <span class="kr">end</span> </span><span id="L-426"><a href="#L-426"><span class="linenos" data-line="426"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">replace_property</span><span class="p">(</span><span class="n">spaces</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span> </span><span id="L-427"><a href="#L-427"><span class="linenos" data-line="427"></span></a> <span class="kr">if</span> <span class="n">id</span> <span class="o">==</span> <span class="s1">'era'</span> <span class="kr">then</span> </span><span id="L-428"><a href="#L-428"><span class="linenos" data-line="428"></span></a> <span class="c1">-- Special case so can use local era option.</span> </span><span id="L-429"><a href="#L-429"><span class="linenos" data-line="429"></span></a> <span class="kd">local</span> <span class="n">result</span> <span class="o">=</span> <span class="n">get_era_for_year</span><span class="p">(</span><span class="n">eraopt</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span><span class="p">)</span> </span><span id="L-430"><a href="#L-430"><span class="linenos" data-line="430"></span></a> <span class="kr">if</span> <span class="n">result</span> <span class="o">==</span> <span class="s1">''</span> <span class="kr">then</span> </span><span id="L-431"><a href="#L-431"><span class="linenos" data-line="431"></span></a> <span class="kr">return</span> <span class="s1">''</span> </span><span id="L-432"><a href="#L-432"><span class="linenos" data-line="432"></span></a> <span class="kr">end</span> </span><span id="L-433"><a href="#L-433"><span class="linenos" data-line="433"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">spaces</span> <span class="o">==</span> <span class="s1">''</span> <span class="ow">and</span> <span class="s1">''</span> <span class="ow">or</span> <span class="s1">'&nbsp;'</span><span class="p">)</span> <span class="o">..</span> <span class="n">result</span> </span><span id="L-434"><a href="#L-434"><span class="linenos" data-line="434"></span></a> <span class="kr">end</span> </span><span id="L-435"><a href="#L-435"><span class="linenos" data-line="435"></span></a> <span class="kd">local</span> <span class="n">result</span> <span class="o">=</span> <span class="n">date</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> </span><span id="L-436"><a href="#L-436"><span class="linenos" data-line="436"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-437"><a href="#L-437"><span class="linenos" data-line="437"></span></a> <span class="kr">return</span> <span class="n">spaces</span> <span class="o">..</span> <span class="n">result</span> </span><span id="L-438"><a href="#L-438"><span class="linenos" data-line="438"></span></a> <span class="kr">end</span> </span><span id="L-439"><a href="#L-439"><span class="linenos" data-line="439"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="kr">then</span> </span><span id="L-440"><a href="#L-440"><span class="linenos" data-line="440"></span></a> <span class="kr">return</span> <span class="n">spaces</span> <span class="o">..</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> </span><span id="L-441"><a href="#L-441"><span class="linenos" data-line="441"></span></a> <span class="kr">end</span> </span><span id="L-442"><a href="#L-442"><span class="linenos" data-line="442"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'boolean'</span> <span class="kr">then</span> </span><span id="L-443"><a href="#L-443"><span class="linenos" data-line="443"></span></a> <span class="kr">return</span> <span class="n">spaces</span> <span class="o">..</span> <span class="p">(</span><span class="n">result</span> <span class="ow">and</span> <span class="s1">'1'</span> <span class="ow">or</span> <span class="s1">'0'</span><span class="p">)</span> </span><span id="L-444"><a href="#L-444"><span class="linenos" data-line="444"></span></a> <span class="kr">end</span> </span><span id="L-445"><a href="#L-445"><span class="linenos" data-line="445"></span></a> <span class="c1">-- This occurs if id is an undefined field in a partial date, or is the name of a function.</span> </span><span id="L-446"><a href="#L-446"><span class="linenos" data-line="446"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-447"><a href="#L-447"><span class="linenos" data-line="447"></span></a> <span class="kr">end</span> </span><span id="L-448"><a href="#L-448"><span class="linenos" data-line="448"></span></a> <span class="kd">local</span> <span class="n">PERCENT</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\127</span><span class="s1">PERCENT</span><span class="se">\127</span><span class="s1">'</span> </span><span id="L-449"><a href="#L-449"><span class="linenos" data-line="449"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">format</span> </span><span id="L-450"><a href="#L-450"><span class="linenos" data-line="450"></span></a> <span class="p">:</span><span class="n">gsub</span><span class="p">(</span><span class="s1">'%%%%'</span><span class="p">,</span> <span class="n">PERCENT</span><span class="p">)</span> </span><span id="L-451"><a href="#L-451"><span class="linenos" data-line="451"></span></a> <span class="p">:</span><span class="n">gsub</span><span class="p">(</span><span class="s1">'(%s*)%%{(%w+)}'</span><span class="p">,</span> <span class="n">replace_property</span><span class="p">)</span> </span><span id="L-452"><a href="#L-452"><span class="linenos" data-line="452"></span></a> <span class="p">:</span><span class="n">gsub</span><span class="p">(</span><span class="s1">'(%s*)%%(%-?)(%a)'</span><span class="p">,</span> <span class="n">replace_code</span><span class="p">)</span> </span><span id="L-453"><a href="#L-453"><span class="linenos" data-line="453"></span></a> <span class="p">:</span><span class="n">gsub</span><span class="p">(</span><span class="n">PERCENT</span><span class="p">,</span> <span class="s1">'%%'</span><span class="p">)</span> </span><span id="L-454"><a href="#L-454"><span class="linenos" data-line="454"></span></a> <span class="p">)</span> </span><span id="L-455"><a href="#L-455"><span class="linenos" data-line="455"></span></a><span class="kr">end</span> </span><span id="L-456"><a href="#L-456"><span class="linenos" data-line="456"></span></a> </span><span id="L-457"><a href="#L-457"><span class="linenos" data-line="457"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">_date_text</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-458"><a href="#L-458"><span class="linenos" data-line="458"></span></a> <span class="c1">-- Return a formatted string representing the given date.</span> </span><span id="L-459"><a href="#L-459"><span class="linenos" data-line="459"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_date</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-460"><a href="#L-460"><span class="linenos" data-line="460"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s1">'date:text: need a date (use "date:text()" with a colon)'</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> </span><span id="L-461"><a href="#L-461"><span class="linenos" data-line="461"></span></a> <span class="kr">end</span> </span><span id="L-462"><a href="#L-462"><span class="linenos" data-line="462"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">fmt</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="ow">and</span> <span class="n">fmt</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'%S'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-463"><a href="#L-463"><span class="linenos" data-line="463"></span></a> <span class="kr">if</span> <span class="n">fmt</span><span class="p">:</span><span class="n">find</span><span class="p">(</span><span class="s1">'%'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-464"><a href="#L-464"><span class="linenos" data-line="464"></span></a> <span class="kr">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-465"><a href="#L-465"><span class="linenos" data-line="465"></span></a> <span class="kr">end</span> </span><span id="L-466"><a href="#L-466"><span class="linenos" data-line="466"></span></a> <span class="kr">elseif</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-467"><a href="#L-467"><span class="linenos" data-line="467"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="ow">and</span> <span class="s1">'my'</span> <span class="ow">or</span> <span class="s1">'y'</span> </span><span id="L-468"><a href="#L-468"><span class="linenos" data-line="468"></span></a> <span class="kr">else</span> </span><span id="L-469"><a href="#L-469"><span class="linenos" data-line="469"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="s1">'dmy'</span> </span><span id="L-470"><a href="#L-470"><span class="linenos" data-line="470"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">hastime</span> <span class="kr">then</span> </span><span id="L-471"><a href="#L-471"><span class="linenos" data-line="471"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="p">(</span><span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">and</span> <span class="s1">'hms '</span> <span class="ow">or</span> <span class="s1">'hm '</span><span class="p">)</span> <span class="o">..</span> <span class="n">fmt</span> </span><span id="L-472"><a href="#L-472"><span class="linenos" data-line="472"></span></a> <span class="kr">end</span> </span><span id="L-473"><a href="#L-473"><span class="linenos" data-line="473"></span></a> <span class="kr">end</span> </span><span id="L-474"><a href="#L-474"><span class="linenos" data-line="474"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">bad_format</span><span class="p">()</span> </span><span id="L-475"><a href="#L-475"><span class="linenos" data-line="475"></span></a> <span class="c1">-- For consistency with other format processing, return given format</span> </span><span id="L-476"><a href="#L-476"><span class="linenos" data-line="476"></span></a> <span class="c1">-- (or cleaned format if original was not a string) if invalid.</span> </span><span id="L-477"><a href="#L-477"><span class="linenos" data-line="477"></span></a> <span class="kr">return</span> <span class="n">mw</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">nowiki</span><span class="p">(</span><span class="n">fmt</span><span class="p">)</span> </span><span id="L-478"><a href="#L-478"><span class="linenos" data-line="478"></span></a> <span class="kr">end</span> </span><span id="L-479"><a href="#L-479"><span class="linenos" data-line="479"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-480"><a href="#L-480"><span class="linenos" data-line="480"></span></a> <span class="c1">-- Ignore days in standard formats like 'ymd'.</span> </span><span id="L-481"><a href="#L-481"><span class="linenos" data-line="481"></span></a> <span class="kr">if</span> <span class="n">fmt</span> <span class="o">==</span> <span class="s1">'ym'</span> <span class="ow">or</span> <span class="n">fmt</span> <span class="o">==</span> <span class="s1">'ymd'</span> <span class="kr">then</span> </span><span id="L-482"><a href="#L-482"><span class="linenos" data-line="482"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="ow">and</span> <span class="s1">'%Y-%m %{era}'</span> <span class="ow">or</span> <span class="s1">'%Y %{era}'</span> </span><span id="L-483"><a href="#L-483"><span class="linenos" data-line="483"></span></a> <span class="kr">elseif</span> <span class="n">fmt</span> <span class="o">==</span> <span class="s1">'my'</span> <span class="ow">or</span> <span class="n">fmt</span> <span class="o">==</span> <span class="s1">'dmy'</span> <span class="ow">or</span> <span class="n">fmt</span> <span class="o">==</span> <span class="s1">'mdy'</span> <span class="kr">then</span> </span><span id="L-484"><a href="#L-484"><span class="linenos" data-line="484"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="ow">and</span> <span class="s1">'%B %-Y %{era}'</span> <span class="ow">or</span> <span class="s1">'%-Y %{era}'</span> </span><span id="L-485"><a href="#L-485"><span class="linenos" data-line="485"></span></a> <span class="kr">elseif</span> <span class="n">fmt</span> <span class="o">==</span> <span class="s1">'y'</span> <span class="kr">then</span> </span><span id="L-486"><a href="#L-486"><span class="linenos" data-line="486"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="ow">and</span> <span class="s1">'%-Y %{era}'</span> <span class="ow">or</span> <span class="s1">'%-Y %{era}'</span> </span><span id="L-487"><a href="#L-487"><span class="linenos" data-line="487"></span></a> <span class="kr">else</span> </span><span id="L-488"><a href="#L-488"><span class="linenos" data-line="488"></span></a> <span class="kr">return</span> <span class="n">bad_format</span><span class="p">()</span> </span><span id="L-489"><a href="#L-489"><span class="linenos" data-line="489"></span></a> <span class="kr">end</span> </span><span id="L-490"><a href="#L-490"><span class="linenos" data-line="490"></span></a> <span class="kr">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-491"><a href="#L-491"><span class="linenos" data-line="491"></span></a> <span class="kr">end</span> </span><span id="L-492"><a href="#L-492"><span class="linenos" data-line="492"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">hm_fmt</span><span class="p">()</span> </span><span id="L-493"><a href="#L-493"><span class="linenos" data-line="493"></span></a> <span class="kd">local</span> <span class="n">plain</span> <span class="o">=</span> <span class="n">make_option_table</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">date</span><span class="p">.</span><span class="n">options</span><span class="p">).</span><span class="n">bydefault</span><span class="p">.</span><span class="n">am</span> </span><span id="L-494"><a href="#L-494"><span class="linenos" data-line="494"></span></a> <span class="kr">return</span> <span class="n">plain</span> <span class="ow">and</span> <span class="s1">'%H:%M'</span> <span class="ow">or</span> <span class="s1">'%-I:%M %p'</span> </span><span id="L-495"><a href="#L-495"><span class="linenos" data-line="495"></span></a> <span class="kr">end</span> </span><span id="L-496"><a href="#L-496"><span class="linenos" data-line="496"></span></a> <span class="kd">local</span> <span class="n">need_time</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">hastime</span> </span><span id="L-497"><a href="#L-497"><span class="linenos" data-line="497"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="n">collection</span><span class="p">()</span> </span><span id="L-498"><a href="#L-498"><span class="linenos" data-line="498"></span></a> <span class="kr">for</span> <span class="n">item</span> <span class="kr">in</span> <span class="n">fmt</span><span class="p">:</span><span class="n">gmatch</span><span class="p">(</span><span class="s1">'%S+'</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-499"><a href="#L-499"><span class="linenos" data-line="499"></span></a> <span class="kd">local</span> <span class="n">f</span> </span><span id="L-500"><a href="#L-500"><span class="linenos" data-line="500"></span></a> <span class="kr">if</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">'hm'</span> <span class="kr">then</span> </span><span id="L-501"><a href="#L-501"><span class="linenos" data-line="501"></span></a> <span class="n">f</span> <span class="o">=</span> <span class="n">hm_fmt</span><span class="p">()</span> </span><span id="L-502"><a href="#L-502"><span class="linenos" data-line="502"></span></a> <span class="n">need_time</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-503"><a href="#L-503"><span class="linenos" data-line="503"></span></a> <span class="kr">elseif</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">'hms'</span> <span class="kr">then</span> </span><span id="L-504"><a href="#L-504"><span class="linenos" data-line="504"></span></a> <span class="n">f</span> <span class="o">=</span> <span class="s1">'%H:%M:%S'</span> </span><span id="L-505"><a href="#L-505"><span class="linenos" data-line="505"></span></a> <span class="n">need_time</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-506"><a href="#L-506"><span class="linenos" data-line="506"></span></a> <span class="kr">elseif</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">'ymd'</span> <span class="kr">then</span> </span><span id="L-507"><a href="#L-507"><span class="linenos" data-line="507"></span></a> <span class="n">f</span> <span class="o">=</span> <span class="s1">'%Y-%m-%d %{era}'</span> </span><span id="L-508"><a href="#L-508"><span class="linenos" data-line="508"></span></a> <span class="kr">elseif</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">'mdy'</span> <span class="kr">then</span> </span><span id="L-509"><a href="#L-509"><span class="linenos" data-line="509"></span></a> <span class="n">f</span> <span class="o">=</span> <span class="s1">'%B %-d, %-Y %{era}'</span> </span><span id="L-510"><a href="#L-510"><span class="linenos" data-line="510"></span></a> <span class="kr">elseif</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">'dmy'</span> <span class="kr">then</span> </span><span id="L-511"><a href="#L-511"><span class="linenos" data-line="511"></span></a> <span class="n">f</span> <span class="o">=</span> <span class="s1">'%-d %B %-Y %{era}'</span> </span><span id="L-512"><a href="#L-512"><span class="linenos" data-line="512"></span></a> <span class="kr">else</span> </span><span id="L-513"><a href="#L-513"><span class="linenos" data-line="513"></span></a> <span class="kr">return</span> <span class="n">bad_format</span><span class="p">()</span> </span><span id="L-514"><a href="#L-514"><span class="linenos" data-line="514"></span></a> <span class="kr">end</span> </span><span id="L-515"><a href="#L-515"><span class="linenos" data-line="515"></span></a> <span class="n">t</span><span class="p">:</span><span class="n">add</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> </span><span id="L-516"><a href="#L-516"><span class="linenos" data-line="516"></span></a> <span class="kr">end</span> </span><span id="L-517"><a href="#L-517"><span class="linenos" data-line="517"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">t</span><span class="p">:</span><span class="n">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span> </span><span id="L-518"><a href="#L-518"><span class="linenos" data-line="518"></span></a> <span class="kr">if</span> <span class="n">need_time</span> <span class="kr">then</span> </span><span id="L-519"><a href="#L-519"><span class="linenos" data-line="519"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="n">hm_fmt</span><span class="p">()</span> <span class="o">..</span> <span class="s1">' '</span> <span class="o">..</span> <span class="n">fmt</span> </span><span id="L-520"><a href="#L-520"><span class="linenos" data-line="520"></span></a> <span class="kr">end</span> </span><span id="L-521"><a href="#L-521"><span class="linenos" data-line="521"></span></a> <span class="kr">return</span> <span class="n">strftime</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-522"><a href="#L-522"><span class="linenos" data-line="522"></span></a><span class="kr">end</span> </span><span id="L-523"><a href="#L-523"><span class="linenos" data-line="523"></span></a> </span><span id="L-524"><a href="#L-524"><span class="linenos" data-line="524"></span></a><span class="kd">local</span> <span class="n">day_info</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-525"><a href="#L-525"><span class="linenos" data-line="525"></span></a> <span class="c1">-- 0=Sun to 6=Sat</span> </span><span id="L-526"><a href="#L-526"><span class="linenos" data-line="526"></span></a> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'Sun'</span><span class="p">,</span> <span class="s1">'Sunday'</span> <span class="p">},</span> </span><span id="L-527"><a href="#L-527"><span class="linenos" data-line="527"></span></a> <span class="p">{</span> <span class="s1">'Mon'</span><span class="p">,</span> <span class="s1">'Monday'</span> <span class="p">},</span> </span><span id="L-528"><a href="#L-528"><span class="linenos" data-line="528"></span></a> <span class="p">{</span> <span class="s1">'Tue'</span><span class="p">,</span> <span class="s1">'Tuesday'</span> <span class="p">},</span> </span><span id="L-529"><a href="#L-529"><span class="linenos" data-line="529"></span></a> <span class="p">{</span> <span class="s1">'Wed'</span><span class="p">,</span> <span class="s1">'Wednesday'</span> <span class="p">},</span> </span><span id="L-530"><a href="#L-530"><span class="linenos" data-line="530"></span></a> <span class="p">{</span> <span class="s1">'Thu'</span><span class="p">,</span> <span class="s1">'Thursday'</span> <span class="p">},</span> </span><span id="L-531"><a href="#L-531"><span class="linenos" data-line="531"></span></a> <span class="p">{</span> <span class="s1">'Fri'</span><span class="p">,</span> <span class="s1">'Friday'</span> <span class="p">},</span> </span><span id="L-532"><a href="#L-532"><span class="linenos" data-line="532"></span></a> <span class="p">{</span> <span class="s1">'Sat'</span><span class="p">,</span> <span class="s1">'Saturday'</span> <span class="p">},</span> </span><span id="L-533"><a href="#L-533"><span class="linenos" data-line="533"></span></a><span class="p">}</span> </span><span id="L-534"><a href="#L-534"><span class="linenos" data-line="534"></span></a> </span><span id="L-535"><a href="#L-535"><span class="linenos" data-line="535"></span></a><span class="kd">local</span> <span class="n">month_info</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-536"><a href="#L-536"><span class="linenos" data-line="536"></span></a> <span class="c1">-- 1=Jan to 12=Dec</span> </span><span id="L-537"><a href="#L-537"><span class="linenos" data-line="537"></span></a> <span class="p">{</span> <span class="s1">'Jan'</span><span class="p">,</span> <span class="s1">'January'</span> <span class="p">},</span> </span><span id="L-538"><a href="#L-538"><span class="linenos" data-line="538"></span></a> <span class="p">{</span> <span class="s1">'Feb'</span><span class="p">,</span> <span class="s1">'February'</span> <span class="p">},</span> </span><span id="L-539"><a href="#L-539"><span class="linenos" data-line="539"></span></a> <span class="p">{</span> <span class="s1">'Mar'</span><span class="p">,</span> <span class="s1">'March'</span> <span class="p">},</span> </span><span id="L-540"><a href="#L-540"><span class="linenos" data-line="540"></span></a> <span class="p">{</span> <span class="s1">'Apr'</span><span class="p">,</span> <span class="s1">'April'</span> <span class="p">},</span> </span><span id="L-541"><a href="#L-541"><span class="linenos" data-line="541"></span></a> <span class="p">{</span> <span class="s1">'May'</span><span class="p">,</span> <span class="s1">'May'</span> <span class="p">},</span> </span><span id="L-542"><a href="#L-542"><span class="linenos" data-line="542"></span></a> <span class="p">{</span> <span class="s1">'Jun'</span><span class="p">,</span> <span class="s1">'June'</span> <span class="p">},</span> </span><span id="L-543"><a href="#L-543"><span class="linenos" data-line="543"></span></a> <span class="p">{</span> <span class="s1">'Jul'</span><span class="p">,</span> <span class="s1">'July'</span> <span class="p">},</span> </span><span id="L-544"><a href="#L-544"><span class="linenos" data-line="544"></span></a> <span class="p">{</span> <span class="s1">'Aug'</span><span class="p">,</span> <span class="s1">'August'</span> <span class="p">},</span> </span><span id="L-545"><a href="#L-545"><span class="linenos" data-line="545"></span></a> <span class="p">{</span> <span class="s1">'Sep'</span><span class="p">,</span> <span class="s1">'September'</span> <span class="p">},</span> </span><span id="L-546"><a href="#L-546"><span class="linenos" data-line="546"></span></a> <span class="p">{</span> <span class="s1">'Oct'</span><span class="p">,</span> <span class="s1">'October'</span> <span class="p">},</span> </span><span id="L-547"><a href="#L-547"><span class="linenos" data-line="547"></span></a> <span class="p">{</span> <span class="s1">'Nov'</span><span class="p">,</span> <span class="s1">'November'</span> <span class="p">},</span> </span><span id="L-548"><a href="#L-548"><span class="linenos" data-line="548"></span></a> <span class="p">{</span> <span class="s1">'Dec'</span><span class="p">,</span> <span class="s1">'December'</span> <span class="p">},</span> </span><span id="L-549"><a href="#L-549"><span class="linenos" data-line="549"></span></a><span class="p">}</span> </span><span id="L-550"><a href="#L-550"><span class="linenos" data-line="550"></span></a> </span><span id="L-551"><a href="#L-551"><span class="linenos" data-line="551"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">name_to_number</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">translate</span><span class="p">)</span> </span><span id="L-552"><a href="#L-552"><span class="linenos" data-line="552"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-553"><a href="#L-553"><span class="linenos" data-line="553"></span></a> <span class="kr">return</span> <span class="n">translate</span><span class="p">[</span><span class="n">text</span><span class="p">:</span><span class="n">lower</span><span class="p">()]</span> </span><span id="L-554"><a href="#L-554"><span class="linenos" data-line="554"></span></a> <span class="kr">end</span> </span><span id="L-555"><a href="#L-555"><span class="linenos" data-line="555"></span></a><span class="kr">end</span> </span><span id="L-556"><a href="#L-556"><span class="linenos" data-line="556"></span></a> </span><span id="L-557"><a href="#L-557"><span class="linenos" data-line="557"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">day_number</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-558"><a href="#L-558"><span class="linenos" data-line="558"></span></a> <span class="kr">return</span> <span class="n">name_to_number</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-559"><a href="#L-559"><span class="linenos" data-line="559"></span></a> <span class="n">sun</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">sunday</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> </span><span id="L-560"><a href="#L-560"><span class="linenos" data-line="560"></span></a> <span class="n">mon</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">monday</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> </span><span id="L-561"><a href="#L-561"><span class="linenos" data-line="561"></span></a> <span class="n">tue</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">tuesday</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> </span><span id="L-562"><a href="#L-562"><span class="linenos" data-line="562"></span></a> <span class="n">wed</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">wednesday</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> </span><span id="L-563"><a href="#L-563"><span class="linenos" data-line="563"></span></a> <span class="n">thu</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">thursday</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> </span><span id="L-564"><a href="#L-564"><span class="linenos" data-line="564"></span></a> <span class="n">fri</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> <span class="n">friday</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> </span><span id="L-565"><a href="#L-565"><span class="linenos" data-line="565"></span></a> <span class="n">sat</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">saturday</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> </span><span id="L-566"><a href="#L-566"><span class="linenos" data-line="566"></span></a> <span class="p">})</span> </span><span id="L-567"><a href="#L-567"><span class="linenos" data-line="567"></span></a><span class="kr">end</span> </span><span id="L-568"><a href="#L-568"><span class="linenos" data-line="568"></span></a> </span><span id="L-569"><a href="#L-569"><span class="linenos" data-line="569"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">month_number</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-570"><a href="#L-570"><span class="linenos" data-line="570"></span></a> <span class="kr">return</span> <span class="n">name_to_number</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-571"><a href="#L-571"><span class="linenos" data-line="571"></span></a> <span class="n">jan</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">january</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> </span><span id="L-572"><a href="#L-572"><span class="linenos" data-line="572"></span></a> <span class="n">feb</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">february</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> </span><span id="L-573"><a href="#L-573"><span class="linenos" data-line="573"></span></a> <span class="n">mar</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">march</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> </span><span id="L-574"><a href="#L-574"><span class="linenos" data-line="574"></span></a> <span class="n">apr</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">april</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> </span><span id="L-575"><a href="#L-575"><span class="linenos" data-line="575"></span></a> <span class="n">may</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> </span><span id="L-576"><a href="#L-576"><span class="linenos" data-line="576"></span></a> <span class="n">jun</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">june</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> </span><span id="L-577"><a href="#L-577"><span class="linenos" data-line="577"></span></a> <span class="n">jul</span> <span class="o">=</span> <span class="mi">7</span><span class="p">,</span> <span class="n">july</span> <span class="o">=</span> <span class="mi">7</span><span class="p">,</span> </span><span id="L-578"><a href="#L-578"><span class="linenos" data-line="578"></span></a> <span class="n">aug</span> <span class="o">=</span> <span class="mi">8</span><span class="p">,</span> <span class="n">august</span> <span class="o">=</span> <span class="mi">8</span><span class="p">,</span> </span><span id="L-579"><a href="#L-579"><span class="linenos" data-line="579"></span></a> <span class="n">sep</span> <span class="o">=</span> <span class="mi">9</span><span class="p">,</span> <span class="n">september</span> <span class="o">=</span> <span class="mi">9</span><span class="p">,</span> <span class="n">sept</span> <span class="o">=</span> <span class="mi">9</span><span class="p">,</span> </span><span id="L-580"><a href="#L-580"><span class="linenos" data-line="580"></span></a> <span class="n">oct</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">october</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> </span><span id="L-581"><a href="#L-581"><span class="linenos" data-line="581"></span></a> <span class="n">nov</span> <span class="o">=</span> <span class="mi">11</span><span class="p">,</span> <span class="n">november</span> <span class="o">=</span> <span class="mi">11</span><span class="p">,</span> </span><span id="L-582"><a href="#L-582"><span class="linenos" data-line="582"></span></a> <span class="n">dec</span> <span class="o">=</span> <span class="mi">12</span><span class="p">,</span> <span class="n">december</span> <span class="o">=</span> <span class="mi">12</span><span class="p">,</span> </span><span id="L-583"><a href="#L-583"><span class="linenos" data-line="583"></span></a> <span class="p">})</span> </span><span id="L-584"><a href="#L-584"><span class="linenos" data-line="584"></span></a><span class="kr">end</span> </span><span id="L-585"><a href="#L-585"><span class="linenos" data-line="585"></span></a> </span><span id="L-586"><a href="#L-586"><span class="linenos" data-line="586"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">_list_text</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">fmt</span><span class="p">)</span> </span><span id="L-587"><a href="#L-587"><span class="linenos" data-line="587"></span></a> <span class="c1">-- Return a list of formatted strings from a list of dates.</span> </span><span id="L-588"><a href="#L-588"><span class="linenos" data-line="588"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="nb">type</span><span class="p">(</span><span class="n">list</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-589"><a href="#L-589"><span class="linenos" data-line="589"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s1">'date:list:text: need "list:text()" with a colon'</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> </span><span id="L-590"><a href="#L-590"><span class="linenos" data-line="590"></span></a> <span class="kr">end</span> </span><span id="L-591"><a href="#L-591"><span class="linenos" data-line="591"></span></a> <span class="kd">local</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{</span> <span class="n">join</span> <span class="o">=</span> <span class="n">_list_join</span> <span class="p">}</span> </span><span id="L-592"><a href="#L-592"><span class="linenos" data-line="592"></span></a> <span class="kr">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">date</span> <span class="kr">in</span> <span class="nb">ipairs</span><span class="p">(</span><span class="n">list</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-593"><a href="#L-593"><span class="linenos" data-line="593"></span></a> <span class="n">result</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span><span class="p">:</span><span class="n">text</span><span class="p">(</span><span class="n">fmt</span><span class="p">)</span> </span><span id="L-594"><a href="#L-594"><span class="linenos" data-line="594"></span></a> <span class="kr">end</span> </span><span id="L-595"><a href="#L-595"><span class="linenos" data-line="595"></span></a> <span class="kr">return</span> <span class="n">result</span> </span><span id="L-596"><a href="#L-596"><span class="linenos" data-line="596"></span></a><span class="kr">end</span> </span><span id="L-597"><a href="#L-597"><span class="linenos" data-line="597"></span></a> </span><span id="L-598"><a href="#L-598"><span class="linenos" data-line="598"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">_date_list</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">spec</span><span class="p">)</span> </span><span id="L-599"><a href="#L-599"><span class="linenos" data-line="599"></span></a> <span class="c1">-- Return a possibly empty numbered table of dates meeting the specification.</span> </span><span id="L-600"><a href="#L-600"><span class="linenos" data-line="600"></span></a> <span class="c1">-- Dates in the list are in ascending order (oldest date first).</span> </span><span id="L-601"><a href="#L-601"><span class="linenos" data-line="601"></span></a> <span class="c1">-- The spec should be a string of form "<count> <day> <op>"</span> </span><span id="L-602"><a href="#L-602"><span class="linenos" data-line="602"></span></a> <span class="c1">-- where each item is optional and</span> </span><span id="L-603"><a href="#L-603"><span class="linenos" data-line="603"></span></a> <span class="c1">-- count = number of items wanted in list</span> </span><span id="L-604"><a href="#L-604"><span class="linenos" data-line="604"></span></a> <span class="c1">-- day = abbreviation or name such as Mon or Monday</span> </span><span id="L-605"><a href="#L-605"><span class="linenos" data-line="605"></span></a> <span class="c1">-- op = >, >=, <, <= (default is > meaning after date)</span> </span><span id="L-606"><a href="#L-606"><span class="linenos" data-line="606"></span></a> <span class="c1">-- If no count is given, the list is for the specified days in date's month.</span> </span><span id="L-607"><a href="#L-607"><span class="linenos" data-line="607"></span></a> <span class="c1">-- The default day is date's day.</span> </span><span id="L-608"><a href="#L-608"><span class="linenos" data-line="608"></span></a> <span class="c1">-- The spec can also be a positive or negative number:</span> </span><span id="L-609"><a href="#L-609"><span class="linenos" data-line="609"></span></a> <span class="c1">-- -5 is equivalent to '5 <'</span> </span><span id="L-610"><a href="#L-610"><span class="linenos" data-line="610"></span></a> <span class="c1">-- 5 is equivalent to '5' which is '5 >'</span> </span><span id="L-611"><a href="#L-611"><span class="linenos" data-line="611"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_date</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-612"><a href="#L-612"><span class="linenos" data-line="612"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s1">'date:list: need a date (use "date:list()" with a colon)'</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> </span><span id="L-613"><a href="#L-613"><span class="linenos" data-line="613"></span></a> <span class="kr">end</span> </span><span id="L-614"><a href="#L-614"><span class="linenos" data-line="614"></span></a> <span class="kd">local</span> <span class="n">list</span> <span class="o">=</span> <span class="p">{</span> <span class="n">text</span> <span class="o">=</span> <span class="n">_list_text</span> <span class="p">}</span> </span><span id="L-615"><a href="#L-615"><span class="linenos" data-line="615"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-616"><a href="#L-616"><span class="linenos" data-line="616"></span></a> <span class="kr">return</span> <span class="n">list</span> </span><span id="L-617"><a href="#L-617"><span class="linenos" data-line="617"></span></a> <span class="kr">end</span> </span><span id="L-618"><a href="#L-618"><span class="linenos" data-line="618"></span></a> <span class="kd">local</span> <span class="n">count</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">operation</span> </span><span id="L-619"><a href="#L-619"><span class="linenos" data-line="619"></span></a> <span class="kd">local</span> <span class="n">ops</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-620"><a href="#L-620"><span class="linenos" data-line="620"></span></a> <span class="p">[</span><span class="s1">'>='</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">before</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span> <span class="n">include</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">},</span> </span><span id="L-621"><a href="#L-621"><span class="linenos" data-line="621"></span></a> <span class="p">[</span><span class="s1">'>'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">before</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span> <span class="n">include</span> <span class="o">=</span> <span class="kc">false</span> <span class="p">},</span> </span><span id="L-622"><a href="#L-622"><span class="linenos" data-line="622"></span></a> <span class="p">[</span><span class="s1">'<='</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">before</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">,</span> <span class="n">include</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">},</span> </span><span id="L-623"><a href="#L-623"><span class="linenos" data-line="623"></span></a> <span class="p">[</span><span class="s1">'<'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">before</span> <span class="o">=</span> <span class="kc">true</span> <span class="p">,</span> <span class="n">include</span> <span class="o">=</span> <span class="kc">false</span> <span class="p">},</span> </span><span id="L-624"><a href="#L-624"><span class="linenos" data-line="624"></span></a> <span class="p">}</span> </span><span id="L-625"><a href="#L-625"><span class="linenos" data-line="625"></span></a> <span class="kr">if</span> <span class="n">spec</span> <span class="kr">then</span> </span><span id="L-626"><a href="#L-626"><span class="linenos" data-line="626"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="kr">then</span> </span><span id="L-627"><a href="#L-627"><span class="linenos" data-line="627"></span></a> <span class="n">count</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">spec</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span> </span><span id="L-628"><a href="#L-628"><span class="linenos" data-line="628"></span></a> <span class="kr">if</span> <span class="n">count</span> <span class="o"><</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-629"><a href="#L-629"><span class="linenos" data-line="629"></span></a> <span class="n">count</span> <span class="o">=</span> <span class="o">-</span><span class="n">count</span> </span><span id="L-630"><a href="#L-630"><span class="linenos" data-line="630"></span></a> <span class="n">operation</span> <span class="o">=</span> <span class="n">ops</span><span class="p">[</span><span class="s1">'<'</span><span class="p">]</span> </span><span id="L-631"><a href="#L-631"><span class="linenos" data-line="631"></span></a> <span class="kr">end</span> </span><span id="L-632"><a href="#L-632"><span class="linenos" data-line="632"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-633"><a href="#L-633"><span class="linenos" data-line="633"></span></a> <span class="kd">local</span> <span class="n">num</span><span class="p">,</span> <span class="n">day</span><span class="p">,</span> <span class="n">op</span> <span class="o">=</span> <span class="n">spec</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^%s*(%d*)%s*(%a*)%s*([<>=]*)%s*$'</span><span class="p">)</span> </span><span id="L-634"><a href="#L-634"><span class="linenos" data-line="634"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">num</span> <span class="kr">then</span> </span><span id="L-635"><a href="#L-635"><span class="linenos" data-line="635"></span></a> <span class="kr">return</span> <span class="n">list</span> </span><span id="L-636"><a href="#L-636"><span class="linenos" data-line="636"></span></a> <span class="kr">end</span> </span><span id="L-637"><a href="#L-637"><span class="linenos" data-line="637"></span></a> <span class="kr">if</span> <span class="n">num</span> <span class="o">~=</span> <span class="s1">''</span> <span class="kr">then</span> </span><span id="L-638"><a href="#L-638"><span class="linenos" data-line="638"></span></a> <span class="n">count</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> </span><span id="L-639"><a href="#L-639"><span class="linenos" data-line="639"></span></a> <span class="kr">end</span> </span><span id="L-640"><a href="#L-640"><span class="linenos" data-line="640"></span></a> <span class="kr">if</span> <span class="n">day</span> <span class="o">~=</span> <span class="s1">''</span> <span class="kr">then</span> </span><span id="L-641"><a href="#L-641"><span class="linenos" data-line="641"></span></a> <span class="kd">local</span> <span class="n">dow</span> <span class="o">=</span> <span class="n">day_number</span><span class="p">(</span><span class="n">day</span><span class="p">:</span><span class="n">gsub</span><span class="p">(</span><span class="s1">'[sS]$'</span><span class="p">,</span> <span class="s1">''</span><span class="p">))</span> <span class="c1">-- accept plural days</span> </span><span id="L-642"><a href="#L-642"><span class="linenos" data-line="642"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">dow</span> <span class="kr">then</span> </span><span id="L-643"><a href="#L-643"><span class="linenos" data-line="643"></span></a> <span class="kr">return</span> <span class="n">list</span> </span><span id="L-644"><a href="#L-644"><span class="linenos" data-line="644"></span></a> <span class="kr">end</span> </span><span id="L-645"><a href="#L-645"><span class="linenos" data-line="645"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">dow</span> <span class="o">-</span> <span class="n">date</span><span class="p">.</span><span class="n">dow</span> </span><span id="L-646"><a href="#L-646"><span class="linenos" data-line="646"></span></a> <span class="kr">end</span> </span><span id="L-647"><a href="#L-647"><span class="linenos" data-line="647"></span></a> <span class="n">operation</span> <span class="o">=</span> <span class="n">ops</span><span class="p">[</span><span class="n">op</span><span class="p">]</span> </span><span id="L-648"><a href="#L-648"><span class="linenos" data-line="648"></span></a> <span class="kr">else</span> </span><span id="L-649"><a href="#L-649"><span class="linenos" data-line="649"></span></a> <span class="kr">return</span> <span class="n">list</span> </span><span id="L-650"><a href="#L-650"><span class="linenos" data-line="650"></span></a> <span class="kr">end</span> </span><span id="L-651"><a href="#L-651"><span class="linenos" data-line="651"></span></a> <span class="kr">end</span> </span><span id="L-652"><a href="#L-652"><span class="linenos" data-line="652"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="ow">or</span> <span class="mi">0</span> </span><span id="L-653"><a href="#L-653"><span class="linenos" data-line="653"></span></a> <span class="n">operation</span> <span class="o">=</span> <span class="n">operation</span> <span class="ow">or</span> <span class="n">ops</span><span class="p">[</span><span class="s1">'>'</span><span class="p">]</span> </span><span id="L-654"><a href="#L-654"><span class="linenos" data-line="654"></span></a> <span class="kd">local</span> <span class="n">datefrom</span><span class="p">,</span> <span class="n">dayfirst</span><span class="p">,</span> <span class="n">daylast</span> </span><span id="L-655"><a href="#L-655"><span class="linenos" data-line="655"></span></a> <span class="kr">if</span> <span class="n">operation</span><span class="p">.</span><span class="n">before</span> <span class="kr">then</span> </span><span id="L-656"><a href="#L-656"><span class="linenos" data-line="656"></span></a> <span class="kr">if</span> <span class="n">offset</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">or</span> <span class="p">(</span><span class="n">offset</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">operation</span><span class="p">.</span><span class="n">include</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-657"><a href="#L-657"><span class="linenos" data-line="657"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">-</span> <span class="mi">7</span> </span><span id="L-658"><a href="#L-658"><span class="linenos" data-line="658"></span></a> <span class="kr">end</span> </span><span id="L-659"><a href="#L-659"><span class="linenos" data-line="659"></span></a> <span class="kr">if</span> <span class="n">count</span> <span class="kr">then</span> </span><span id="L-660"><a href="#L-660"><span class="linenos" data-line="660"></span></a> <span class="kr">if</span> <span class="n">count</span> <span class="o">></span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-661"><a href="#L-661"><span class="linenos" data-line="661"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">-</span> <span class="mi">7</span><span class="o">*</span><span class="p">(</span><span class="n">count</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-662"><a href="#L-662"><span class="linenos" data-line="662"></span></a> <span class="kr">end</span> </span><span id="L-663"><a href="#L-663"><span class="linenos" data-line="663"></span></a> <span class="n">datefrom</span> <span class="o">=</span> <span class="n">date</span> <span class="o">+</span> <span class="n">offset</span> </span><span id="L-664"><a href="#L-664"><span class="linenos" data-line="664"></span></a> <span class="kr">else</span> </span><span id="L-665"><a href="#L-665"><span class="linenos" data-line="665"></span></a> <span class="n">daylast</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">+</span> <span class="n">offset</span> </span><span id="L-666"><a href="#L-666"><span class="linenos" data-line="666"></span></a> <span class="n">dayfirst</span> <span class="o">=</span> <span class="n">daylast</span> <span class="o">%</span> <span class="mi">7</span> </span><span id="L-667"><a href="#L-667"><span class="linenos" data-line="667"></span></a> <span class="kr">if</span> <span class="n">dayfirst</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-668"><a href="#L-668"><span class="linenos" data-line="668"></span></a> <span class="n">dayfirst</span> <span class="o">=</span> <span class="mi">7</span> </span><span id="L-669"><a href="#L-669"><span class="linenos" data-line="669"></span></a> <span class="kr">end</span> </span><span id="L-670"><a href="#L-670"><span class="linenos" data-line="670"></span></a> <span class="kr">end</span> </span><span id="L-671"><a href="#L-671"><span class="linenos" data-line="671"></span></a> <span class="kr">else</span> </span><span id="L-672"><a href="#L-672"><span class="linenos" data-line="672"></span></a> <span class="kr">if</span> <span class="n">offset</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="p">(</span><span class="n">offset</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">operation</span><span class="p">.</span><span class="n">include</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-673"><a href="#L-673"><span class="linenos" data-line="673"></span></a> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="mi">7</span> </span><span id="L-674"><a href="#L-674"><span class="linenos" data-line="674"></span></a> <span class="kr">end</span> </span><span id="L-675"><a href="#L-675"><span class="linenos" data-line="675"></span></a> <span class="kr">if</span> <span class="n">count</span> <span class="kr">then</span> </span><span id="L-676"><a href="#L-676"><span class="linenos" data-line="676"></span></a> <span class="n">datefrom</span> <span class="o">=</span> <span class="n">date</span> <span class="o">+</span> <span class="n">offset</span> </span><span id="L-677"><a href="#L-677"><span class="linenos" data-line="677"></span></a> <span class="kr">else</span> </span><span id="L-678"><a href="#L-678"><span class="linenos" data-line="678"></span></a> <span class="n">dayfirst</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">+</span> <span class="n">offset</span> </span><span id="L-679"><a href="#L-679"><span class="linenos" data-line="679"></span></a> <span class="n">daylast</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">monthdays</span> </span><span id="L-680"><a href="#L-680"><span class="linenos" data-line="680"></span></a> <span class="kr">end</span> </span><span id="L-681"><a href="#L-681"><span class="linenos" data-line="681"></span></a> <span class="kr">end</span> </span><span id="L-682"><a href="#L-682"><span class="linenos" data-line="682"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">count</span> <span class="kr">then</span> </span><span id="L-683"><a href="#L-683"><span class="linenos" data-line="683"></span></a> <span class="kr">if</span> <span class="n">daylast</span> <span class="o"><</span> <span class="n">dayfirst</span> <span class="kr">then</span> </span><span id="L-684"><a href="#L-684"><span class="linenos" data-line="684"></span></a> <span class="kr">return</span> <span class="n">list</span> </span><span id="L-685"><a href="#L-685"><span class="linenos" data-line="685"></span></a> <span class="kr">end</span> </span><span id="L-686"><a href="#L-686"><span class="linenos" data-line="686"></span></a> <span class="n">count</span> <span class="o">=</span> <span class="n">floor</span><span class="p">((</span><span class="n">daylast</span> <span class="o">-</span> <span class="n">dayfirst</span><span class="p">)</span><span class="o">/</span><span class="mi">7</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-687"><a href="#L-687"><span class="linenos" data-line="687"></span></a> <span class="n">datefrom</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="p">{</span><span class="n">day</span> <span class="o">=</span> <span class="n">dayfirst</span><span class="p">})</span> </span><span id="L-688"><a href="#L-688"><span class="linenos" data-line="688"></span></a> <span class="kr">end</span> </span><span id="L-689"><a href="#L-689"><span class="linenos" data-line="689"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">count</span> <span class="kr">do</span> </span><span id="L-690"><a href="#L-690"><span class="linenos" data-line="690"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">datefrom</span> <span class="kr">then</span> <span class="kr">break</span> <span class="kr">end</span> <span class="c1">-- exceeds date limits</span> </span><span id="L-691"><a href="#L-691"><span class="linenos" data-line="691"></span></a> <span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">datefrom</span> </span><span id="L-692"><a href="#L-692"><span class="linenos" data-line="692"></span></a> <span class="n">datefrom</span> <span class="o">=</span> <span class="n">datefrom</span> <span class="o">+</span> <span class="mi">7</span> </span><span id="L-693"><a href="#L-693"><span class="linenos" data-line="693"></span></a> <span class="kr">end</span> </span><span id="L-694"><a href="#L-694"><span class="linenos" data-line="694"></span></a> <span class="kr">return</span> <span class="n">list</span> </span><span id="L-695"><a href="#L-695"><span class="linenos" data-line="695"></span></a><span class="kr">end</span> </span><span id="L-696"><a href="#L-696"><span class="linenos" data-line="696"></span></a> </span><span id="L-697"><a href="#L-697"><span class="linenos" data-line="697"></span></a><span class="c1">-- A table to get the current date/time (UTC), but only if needed.</span> </span><span id="L-698"><a href="#L-698"><span class="linenos" data-line="698"></span></a><span class="kd">local</span> <span class="n">current</span> <span class="o">=</span> <span class="nb">setmetatable</span><span class="p">({},</span> <span class="p">{</span> </span><span id="L-699"><a href="#L-699"><span class="linenos" data-line="699"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> </span><span id="L-700"><a href="#L-700"><span class="linenos" data-line="700"></span></a> <span class="kd">local</span> <span class="n">d</span> <span class="o">=</span> <span class="nb">os.date</span><span class="p">(</span><span class="s1">'!*t'</span><span class="p">)</span> </span><span id="L-701"><a href="#L-701"><span class="linenos" data-line="701"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">year</span> </span><span id="L-702"><a href="#L-702"><span class="linenos" data-line="702"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">month</span> </span><span id="L-703"><a href="#L-703"><span class="linenos" data-line="703"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">day</span> </span><span id="L-704"><a href="#L-704"><span class="linenos" data-line="704"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">hour</span> </span><span id="L-705"><a href="#L-705"><span class="linenos" data-line="705"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">min</span> </span><span id="L-706"><a href="#L-706"><span class="linenos" data-line="706"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">sec</span> </span><span id="L-707"><a href="#L-707"><span class="linenos" data-line="707"></span></a> <span class="kr">return</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> </span><span id="L-708"><a href="#L-708"><span class="linenos" data-line="708"></span></a> <span class="kr">end</span> <span class="p">})</span> </span><span id="L-709"><a href="#L-709"><span class="linenos" data-line="709"></span></a> </span><span id="L-710"><a href="#L-710"><span class="linenos" data-line="710"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">extract_date</span><span class="p">(</span><span class="n">newdate</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span> </span><span id="L-711"><a href="#L-711"><span class="linenos" data-line="711"></span></a> <span class="c1">-- Parse the date/time in text and return n, o where</span> </span><span id="L-712"><a href="#L-712"><span class="linenos" data-line="712"></span></a> <span class="c1">-- n = table of numbers with date/time fields</span> </span><span id="L-713"><a href="#L-713"><span class="linenos" data-line="713"></span></a> <span class="c1">-- o = table of options for AM/PM or AD/BC or format, if any</span> </span><span id="L-714"><a href="#L-714"><span class="linenos" data-line="714"></span></a> <span class="c1">-- or return nothing if date is known to be invalid.</span> </span><span id="L-715"><a href="#L-715"><span class="linenos" data-line="715"></span></a> <span class="c1">-- Caller determines if the values in n are valid.</span> </span><span id="L-716"><a href="#L-716"><span class="linenos" data-line="716"></span></a> <span class="c1">-- A year must be positive ('1' to '9999'); use 'BC' for BC.</span> </span><span id="L-717"><a href="#L-717"><span class="linenos" data-line="717"></span></a> <span class="c1">-- In a y-m-d string, the year must be four digits to avoid ambiguity</span> </span><span id="L-718"><a href="#L-718"><span class="linenos" data-line="718"></span></a> <span class="c1">-- ('0001' to '9999'). The only way to enter year <= 0 is by specifying</span> </span><span id="L-719"><a href="#L-719"><span class="linenos" data-line="719"></span></a> <span class="c1">-- the date as three numeric parameters like ymd Date(-1, 1, 1).</span> </span><span id="L-720"><a href="#L-720"><span class="linenos" data-line="720"></span></a> <span class="c1">-- Dates of form d/m/y, m/d/y, y/m/d are rejected as potentially ambiguous.</span> </span><span id="L-721"><a href="#L-721"><span class="linenos" data-line="721"></span></a> <span class="kd">local</span> <span class="n">date</span><span class="p">,</span> <span class="n">options</span> <span class="o">=</span> <span class="p">{},</span> <span class="p">{}</span> </span><span id="L-722"><a href="#L-722"><span class="linenos" data-line="722"></span></a> <span class="kr">if</span> <span class="n">text</span><span class="p">:</span><span class="n">sub</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'Z'</span> <span class="kr">then</span> </span><span id="L-723"><a href="#L-723"><span class="linenos" data-line="723"></span></a> <span class="c1">-- Extract date/time from a Wikidata timestamp.</span> </span><span id="L-724"><a href="#L-724"><span class="linenos" data-line="724"></span></a> <span class="c1">-- The year can be 1 to 16 digits but this module handles 1 to 4 digits only.</span> </span><span id="L-725"><a href="#L-725"><span class="linenos" data-line="725"></span></a> <span class="c1">-- Examples: '+2016-06-21T14:30:00Z', '-0000000180-00-00T00:00:00Z'.</span> </span><span id="L-726"><a href="#L-726"><span class="linenos" data-line="726"></span></a> <span class="kd">local</span> <span class="n">sign</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> <span class="o">=</span> <span class="n">text</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^([+%-])(%d+)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)Z$'</span><span class="p">)</span> </span><span id="L-727"><a href="#L-727"><span class="linenos" data-line="727"></span></a> <span class="kr">if</span> <span class="n">sign</span> <span class="kr">then</span> </span><span id="L-728"><a href="#L-728"><span class="linenos" data-line="728"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> </span><span id="L-729"><a href="#L-729"><span class="linenos" data-line="729"></span></a> <span class="kr">if</span> <span class="n">sign</span> <span class="o">==</span> <span class="s1">'-'</span> <span class="ow">and</span> <span class="n">y</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-730"><a href="#L-730"><span class="linenos" data-line="730"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="o">-</span><span class="n">y</span> </span><span id="L-731"><a href="#L-731"><span class="linenos" data-line="731"></span></a> <span class="kr">end</span> </span><span id="L-732"><a href="#L-732"><span class="linenos" data-line="732"></span></a> <span class="kr">if</span> <span class="n">y</span> <span class="o"><=</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-733"><a href="#L-733"><span class="linenos" data-line="733"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">era</span> <span class="o">=</span> <span class="s1">'BCE'</span> </span><span id="L-734"><a href="#L-734"><span class="linenos" data-line="734"></span></a> <span class="kr">end</span> </span><span id="L-735"><a href="#L-735"><span class="linenos" data-line="735"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">y</span> </span><span id="L-736"><a href="#L-736"><span class="linenos" data-line="736"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> </span><span id="L-737"><a href="#L-737"><span class="linenos" data-line="737"></span></a> <span class="n">d</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> </span><span id="L-738"><a href="#L-738"><span class="linenos" data-line="738"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">H</span><span class="p">)</span> </span><span id="L-739"><a href="#L-739"><span class="linenos" data-line="739"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">M</span><span class="p">)</span> </span><span id="L-740"><a href="#L-740"><span class="linenos" data-line="740"></span></a> <span class="n">S</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">S</span><span class="p">)</span> </span><span id="L-741"><a href="#L-741"><span class="linenos" data-line="741"></span></a> <span class="kr">if</span> <span class="n">m</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-742"><a href="#L-742"><span class="linenos" data-line="742"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-743"><a href="#L-743"><span class="linenos" data-line="743"></span></a> <span class="kr">return</span> <span class="n">date</span><span class="p">,</span> <span class="n">options</span> </span><span id="L-744"><a href="#L-744"><span class="linenos" data-line="744"></span></a> <span class="kr">end</span> </span><span id="L-745"><a href="#L-745"><span class="linenos" data-line="745"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">m</span> </span><span id="L-746"><a href="#L-746"><span class="linenos" data-line="746"></span></a> <span class="kr">if</span> <span class="n">d</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-747"><a href="#L-747"><span class="linenos" data-line="747"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-748"><a href="#L-748"><span class="linenos" data-line="748"></span></a> <span class="kr">return</span> <span class="n">date</span><span class="p">,</span> <span class="n">options</span> </span><span id="L-749"><a href="#L-749"><span class="linenos" data-line="749"></span></a> <span class="kr">end</span> </span><span id="L-750"><a href="#L-750"><span class="linenos" data-line="750"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">d</span> </span><span id="L-751"><a href="#L-751"><span class="linenos" data-line="751"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">M</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">S</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-752"><a href="#L-752"><span class="linenos" data-line="752"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">H</span> </span><span id="L-753"><a href="#L-753"><span class="linenos" data-line="753"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="n">M</span> </span><span id="L-754"><a href="#L-754"><span class="linenos" data-line="754"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">S</span> </span><span id="L-755"><a href="#L-755"><span class="linenos" data-line="755"></span></a> <span class="kr">end</span> </span><span id="L-756"><a href="#L-756"><span class="linenos" data-line="756"></span></a> <span class="kr">return</span> <span class="n">date</span><span class="p">,</span> <span class="n">options</span> </span><span id="L-757"><a href="#L-757"><span class="linenos" data-line="757"></span></a> <span class="kr">end</span> </span><span id="L-758"><a href="#L-758"><span class="linenos" data-line="758"></span></a> <span class="kr">return</span> </span><span id="L-759"><a href="#L-759"><span class="linenos" data-line="759"></span></a> <span class="kr">end</span> </span><span id="L-760"><a href="#L-760"><span class="linenos" data-line="760"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">extract_ymd</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-761"><a href="#L-761"><span class="linenos" data-line="761"></span></a> <span class="c1">-- Called when no day or month has been set.</span> </span><span id="L-762"><a href="#L-762"><span class="linenos" data-line="762"></span></a> <span class="kd">local</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">item</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^(%d%d%d%d)%-(%w+)%-(%d%d?)$'</span><span class="p">)</span> </span><span id="L-763"><a href="#L-763"><span class="linenos" data-line="763"></span></a> <span class="kr">if</span> <span class="n">y</span> <span class="kr">then</span> </span><span id="L-764"><a href="#L-764"><span class="linenos" data-line="764"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="kr">then</span> </span><span id="L-765"><a href="#L-765"><span class="linenos" data-line="765"></span></a> <span class="kr">return</span> </span><span id="L-766"><a href="#L-766"><span class="linenos" data-line="766"></span></a> <span class="kr">end</span> </span><span id="L-767"><a href="#L-767"><span class="linenos" data-line="767"></span></a> <span class="kr">if</span> <span class="n">m</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^%d%d?$'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-768"><a href="#L-768"><span class="linenos" data-line="768"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> </span><span id="L-769"><a href="#L-769"><span class="linenos" data-line="769"></span></a> <span class="kr">else</span> </span><span id="L-770"><a href="#L-770"><span class="linenos" data-line="770"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">month_number</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> </span><span id="L-771"><a href="#L-771"><span class="linenos" data-line="771"></span></a> <span class="kr">end</span> </span><span id="L-772"><a href="#L-772"><span class="linenos" data-line="772"></span></a> <span class="kr">if</span> <span class="n">m</span> <span class="kr">then</span> </span><span id="L-773"><a href="#L-773"><span class="linenos" data-line="773"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> </span><span id="L-774"><a href="#L-774"><span class="linenos" data-line="774"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">m</span> </span><span id="L-775"><a href="#L-775"><span class="linenos" data-line="775"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> </span><span id="L-776"><a href="#L-776"><span class="linenos" data-line="776"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-777"><a href="#L-777"><span class="linenos" data-line="777"></span></a> <span class="kr">end</span> </span><span id="L-778"><a href="#L-778"><span class="linenos" data-line="778"></span></a> <span class="kr">end</span> </span><span id="L-779"><a href="#L-779"><span class="linenos" data-line="779"></span></a> <span class="kr">end</span> </span><span id="L-780"><a href="#L-780"><span class="linenos" data-line="780"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">extract_day_or_year</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-781"><a href="#L-781"><span class="linenos" data-line="781"></span></a> <span class="c1">-- Called when a day would be valid, or</span> </span><span id="L-782"><a href="#L-782"><span class="linenos" data-line="782"></span></a> <span class="c1">-- when a year would be valid if no year has been set and partial is set.</span> </span><span id="L-783"><a href="#L-783"><span class="linenos" data-line="783"></span></a> <span class="kd">local</span> <span class="n">number</span><span class="p">,</span> <span class="n">suffix</span> <span class="o">=</span> <span class="n">item</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^(%d%d?%d?%d?)(.*)$'</span><span class="p">)</span> </span><span id="L-784"><a href="#L-784"><span class="linenos" data-line="784"></span></a> <span class="kr">if</span> <span class="n">number</span> <span class="kr">then</span> </span><span id="L-785"><a href="#L-785"><span class="linenos" data-line="785"></span></a> <span class="kd">local</span> <span class="n">n</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">number</span><span class="p">)</span> </span><span id="L-786"><a href="#L-786"><span class="linenos" data-line="786"></span></a> <span class="kr">if</span> <span class="o">#</span><span class="n">number</span> <span class="o"><=</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">n</span> <span class="o"><=</span> <span class="mi">31</span> <span class="kr">then</span> </span><span id="L-787"><a href="#L-787"><span class="linenos" data-line="787"></span></a> <span class="n">suffix</span> <span class="o">=</span> <span class="n">suffix</span><span class="p">:</span><span class="n">lower</span><span class="p">()</span> </span><span id="L-788"><a href="#L-788"><span class="linenos" data-line="788"></span></a> <span class="kr">if</span> <span class="n">suffix</span> <span class="o">==</span> <span class="s1">''</span> <span class="ow">or</span> <span class="n">suffix</span> <span class="o">==</span> <span class="s1">'st'</span> <span class="ow">or</span> <span class="n">suffix</span> <span class="o">==</span> <span class="s1">'nd'</span> <span class="ow">or</span> <span class="n">suffix</span> <span class="o">==</span> <span class="s1">'rd'</span> <span class="ow">or</span> <span class="n">suffix</span> <span class="o">==</span> <span class="s1">'th'</span> <span class="kr">then</span> </span><span id="L-789"><a href="#L-789"><span class="linenos" data-line="789"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">n</span> </span><span id="L-790"><a href="#L-790"><span class="linenos" data-line="790"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-791"><a href="#L-791"><span class="linenos" data-line="791"></span></a> <span class="kr">end</span> </span><span id="L-792"><a href="#L-792"><span class="linenos" data-line="792"></span></a> <span class="kr">elseif</span> <span class="n">suffix</span> <span class="o">==</span> <span class="s1">''</span> <span class="ow">and</span> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="kr">then</span> </span><span id="L-793"><a href="#L-793"><span class="linenos" data-line="793"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">n</span> </span><span id="L-794"><a href="#L-794"><span class="linenos" data-line="794"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-795"><a href="#L-795"><span class="linenos" data-line="795"></span></a> <span class="kr">end</span> </span><span id="L-796"><a href="#L-796"><span class="linenos" data-line="796"></span></a> <span class="kr">end</span> </span><span id="L-797"><a href="#L-797"><span class="linenos" data-line="797"></span></a> <span class="kr">end</span> </span><span id="L-798"><a href="#L-798"><span class="linenos" data-line="798"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">extract_month</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-799"><a href="#L-799"><span class="linenos" data-line="799"></span></a> <span class="c1">-- A month must be given as a name or abbreviation; a number could be ambiguous.</span> </span><span id="L-800"><a href="#L-800"><span class="linenos" data-line="800"></span></a> <span class="kd">local</span> <span class="n">m</span> <span class="o">=</span> <span class="n">month_number</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-801"><a href="#L-801"><span class="linenos" data-line="801"></span></a> <span class="kr">if</span> <span class="n">m</span> <span class="kr">then</span> </span><span id="L-802"><a href="#L-802"><span class="linenos" data-line="802"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">m</span> </span><span id="L-803"><a href="#L-803"><span class="linenos" data-line="803"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-804"><a href="#L-804"><span class="linenos" data-line="804"></span></a> <span class="kr">end</span> </span><span id="L-805"><a href="#L-805"><span class="linenos" data-line="805"></span></a> <span class="kr">end</span> </span><span id="L-806"><a href="#L-806"><span class="linenos" data-line="806"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">extract_time</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-807"><a href="#L-807"><span class="linenos" data-line="807"></span></a> <span class="kd">local</span> <span class="n">h</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">item</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^(%d%d?):(%d%d)(:?%d*)$'</span><span class="p">)</span> </span><span id="L-808"><a href="#L-808"><span class="linenos" data-line="808"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">h</span> <span class="kr">then</span> </span><span id="L-809"><a href="#L-809"><span class="linenos" data-line="809"></span></a> <span class="kr">return</span> </span><span id="L-810"><a href="#L-810"><span class="linenos" data-line="810"></span></a> <span class="kr">end</span> </span><span id="L-811"><a href="#L-811"><span class="linenos" data-line="811"></span></a> <span class="kr">if</span> <span class="n">s</span> <span class="o">~=</span> <span class="s1">''</span> <span class="kr">then</span> </span><span id="L-812"><a href="#L-812"><span class="linenos" data-line="812"></span></a> <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^:(%d%d)$'</span><span class="p">)</span> </span><span id="L-813"><a href="#L-813"><span class="linenos" data-line="813"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">s</span> <span class="kr">then</span> </span><span id="L-814"><a href="#L-814"><span class="linenos" data-line="814"></span></a> <span class="kr">return</span> </span><span id="L-815"><a href="#L-815"><span class="linenos" data-line="815"></span></a> <span class="kr">end</span> </span><span id="L-816"><a href="#L-816"><span class="linenos" data-line="816"></span></a> <span class="kr">end</span> </span><span id="L-817"><a href="#L-817"><span class="linenos" data-line="817"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> </span><span id="L-818"><a href="#L-818"><span class="linenos" data-line="818"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> </span><span id="L-819"><a href="#L-819"><span class="linenos" data-line="819"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="c1">-- nil if empty string</span> </span><span id="L-820"><a href="#L-820"><span class="linenos" data-line="820"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-821"><a href="#L-821"><span class="linenos" data-line="821"></span></a> <span class="kr">end</span> </span><span id="L-822"><a href="#L-822"><span class="linenos" data-line="822"></span></a> <span class="kd">local</span> <span class="n">item_count</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-823"><a href="#L-823"><span class="linenos" data-line="823"></span></a> <span class="kd">local</span> <span class="n">index_time</span> </span><span id="L-824"><a href="#L-824"><span class="linenos" data-line="824"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">set_ampm</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-825"><a href="#L-825"><span class="linenos" data-line="825"></span></a> <span class="kd">local</span> <span class="n">H</span> <span class="o">=</span> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> </span><span id="L-826"><a href="#L-826"><span class="linenos" data-line="826"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">options</span><span class="p">.</span><span class="n">am</span> <span class="ow">and</span> <span class="n">index_time</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">==</span> <span class="n">item_count</span> <span class="kr">then</span> </span><span id="L-827"><a href="#L-827"><span class="linenos" data-line="827"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">am</span> <span class="o">=</span> <span class="n">ampm_options</span><span class="p">[</span><span class="n">item</span><span class="p">]</span> <span class="c1">-- caller checked this is not nil</span> </span><span id="L-828"><a href="#L-828"><span class="linenos" data-line="828"></span></a> <span class="kr">if</span> <span class="n">item</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^[Aa]'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-829"><a href="#L-829"><span class="linenos" data-line="829"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><=</span> <span class="n">H</span> <span class="ow">and</span> <span class="n">H</span> <span class="o"><=</span> <span class="mi">12</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-830"><a href="#L-830"><span class="linenos" data-line="830"></span></a> <span class="kr">return</span> </span><span id="L-831"><a href="#L-831"><span class="linenos" data-line="831"></span></a> <span class="kr">end</span> </span><span id="L-832"><a href="#L-832"><span class="linenos" data-line="832"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="o">==</span> <span class="mi">12</span> <span class="kr">then</span> </span><span id="L-833"><a href="#L-833"><span class="linenos" data-line="833"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-834"><a href="#L-834"><span class="linenos" data-line="834"></span></a> <span class="kr">end</span> </span><span id="L-835"><a href="#L-835"><span class="linenos" data-line="835"></span></a> <span class="kr">else</span> </span><span id="L-836"><a href="#L-836"><span class="linenos" data-line="836"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><=</span> <span class="n">H</span> <span class="ow">and</span> <span class="n">H</span> <span class="o"><=</span> <span class="mi">23</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-837"><a href="#L-837"><span class="linenos" data-line="837"></span></a> <span class="kr">return</span> </span><span id="L-838"><a href="#L-838"><span class="linenos" data-line="838"></span></a> <span class="kr">end</span> </span><span id="L-839"><a href="#L-839"><span class="linenos" data-line="839"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="o"><=</span> <span class="mi">11</span> <span class="kr">then</span> </span><span id="L-840"><a href="#L-840"><span class="linenos" data-line="840"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">H</span> <span class="o">+</span> <span class="mi">12</span> </span><span id="L-841"><a href="#L-841"><span class="linenos" data-line="841"></span></a> <span class="kr">end</span> </span><span id="L-842"><a href="#L-842"><span class="linenos" data-line="842"></span></a> <span class="kr">end</span> </span><span id="L-843"><a href="#L-843"><span class="linenos" data-line="843"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-844"><a href="#L-844"><span class="linenos" data-line="844"></span></a> <span class="kr">end</span> </span><span id="L-845"><a href="#L-845"><span class="linenos" data-line="845"></span></a> <span class="kr">end</span> </span><span id="L-846"><a href="#L-846"><span class="linenos" data-line="846"></span></a> <span class="kr">for</span> <span class="n">item</span> <span class="kr">in</span> <span class="n">text</span><span class="p">:</span><span class="n">gsub</span><span class="p">(</span><span class="s1">','</span><span class="p">,</span> <span class="s1">' '</span><span class="p">):</span><span class="n">gsub</span><span class="p">(</span><span class="s1">'&nbsp;'</span><span class="p">,</span> <span class="s1">' '</span><span class="p">):</span><span class="n">gmatch</span><span class="p">(</span><span class="s1">'%S+'</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-847"><a href="#L-847"><span class="linenos" data-line="847"></span></a> <span class="n">item_count</span> <span class="o">=</span> <span class="n">item_count</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-848"><a href="#L-848"><span class="linenos" data-line="848"></span></a> <span class="kr">if</span> <span class="n">era_text</span><span class="p">[</span><span class="n">item</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-849"><a href="#L-849"><span class="linenos" data-line="849"></span></a> <span class="c1">-- Era is accepted in peculiar places.</span> </span><span id="L-850"><a href="#L-850"><span class="linenos" data-line="850"></span></a> <span class="kr">if</span> <span class="n">options</span><span class="p">.</span><span class="n">era</span> <span class="kr">then</span> </span><span id="L-851"><a href="#L-851"><span class="linenos" data-line="851"></span></a> <span class="kr">return</span> </span><span id="L-852"><a href="#L-852"><span class="linenos" data-line="852"></span></a> <span class="kr">end</span> </span><span id="L-853"><a href="#L-853"><span class="linenos" data-line="853"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">era</span> <span class="o">=</span> <span class="n">item</span> </span><span id="L-854"><a href="#L-854"><span class="linenos" data-line="854"></span></a> <span class="kr">elseif</span> <span class="n">ampm_options</span><span class="p">[</span><span class="n">item</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-855"><a href="#L-855"><span class="linenos" data-line="855"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">set_ampm</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-856"><a href="#L-856"><span class="linenos" data-line="856"></span></a> <span class="kr">return</span> </span><span id="L-857"><a href="#L-857"><span class="linenos" data-line="857"></span></a> <span class="kr">end</span> </span><span id="L-858"><a href="#L-858"><span class="linenos" data-line="858"></span></a> <span class="kr">elseif</span> <span class="n">item</span><span class="p">:</span><span class="n">find</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-859"><a href="#L-859"><span class="linenos" data-line="859"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">extract_time</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-860"><a href="#L-860"><span class="linenos" data-line="860"></span></a> <span class="kr">return</span> </span><span id="L-861"><a href="#L-861"><span class="linenos" data-line="861"></span></a> <span class="kr">end</span> </span><span id="L-862"><a href="#L-862"><span class="linenos" data-line="862"></span></a> <span class="n">index_time</span> <span class="o">=</span> <span class="n">item_count</span> </span><span id="L-863"><a href="#L-863"><span class="linenos" data-line="863"></span></a> <span class="kr">elseif</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="ow">and</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="kr">then</span> </span><span id="L-864"><a href="#L-864"><span class="linenos" data-line="864"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="kr">then</span> </span><span id="L-865"><a href="#L-865"><span class="linenos" data-line="865"></span></a> <span class="kr">return</span> <span class="c1">-- should be nothing more so item is invalid</span> </span><span id="L-866"><a href="#L-866"><span class="linenos" data-line="866"></span></a> <span class="kr">end</span> </span><span id="L-867"><a href="#L-867"><span class="linenos" data-line="867"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">item</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^(%d%d?%d?%d?)$'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-868"><a href="#L-868"><span class="linenos" data-line="868"></span></a> <span class="kr">return</span> </span><span id="L-869"><a href="#L-869"><span class="linenos" data-line="869"></span></a> <span class="kr">end</span> </span><span id="L-870"><a href="#L-870"><span class="linenos" data-line="870"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> </span><span id="L-871"><a href="#L-871"><span class="linenos" data-line="871"></span></a> <span class="kr">elseif</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="kr">then</span> </span><span id="L-872"><a href="#L-872"><span class="linenos" data-line="872"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">extract_month</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-873"><a href="#L-873"><span class="linenos" data-line="873"></span></a> <span class="kr">return</span> </span><span id="L-874"><a href="#L-874"><span class="linenos" data-line="874"></span></a> <span class="kr">end</span> </span><span id="L-875"><a href="#L-875"><span class="linenos" data-line="875"></span></a> <span class="kr">elseif</span> <span class="n">date</span><span class="p">.</span><span class="n">month</span> <span class="kr">then</span> </span><span id="L-876"><a href="#L-876"><span class="linenos" data-line="876"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">extract_day_or_year</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-877"><a href="#L-877"><span class="linenos" data-line="877"></span></a> <span class="kr">return</span> </span><span id="L-878"><a href="#L-878"><span class="linenos" data-line="878"></span></a> <span class="kr">end</span> </span><span id="L-879"><a href="#L-879"><span class="linenos" data-line="879"></span></a> <span class="kr">elseif</span> <span class="n">extract_month</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-880"><a href="#L-880"><span class="linenos" data-line="880"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">format</span> <span class="o">=</span> <span class="s1">'mdy'</span> </span><span id="L-881"><a href="#L-881"><span class="linenos" data-line="881"></span></a> <span class="kr">elseif</span> <span class="n">extract_ymd</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-882"><a href="#L-882"><span class="linenos" data-line="882"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">format</span> <span class="o">=</span> <span class="s1">'ymd'</span> </span><span id="L-883"><a href="#L-883"><span class="linenos" data-line="883"></span></a> <span class="kr">elseif</span> <span class="n">extract_day_or_year</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-884"><a href="#L-884"><span class="linenos" data-line="884"></span></a> <span class="kr">if</span> <span class="n">date</span><span class="p">.</span><span class="n">day</span> <span class="kr">then</span> </span><span id="L-885"><a href="#L-885"><span class="linenos" data-line="885"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">format</span> <span class="o">=</span> <span class="s1">'dmy'</span> </span><span id="L-886"><a href="#L-886"><span class="linenos" data-line="886"></span></a> <span class="kr">end</span> </span><span id="L-887"><a href="#L-887"><span class="linenos" data-line="887"></span></a> <span class="kr">else</span> </span><span id="L-888"><a href="#L-888"><span class="linenos" data-line="888"></span></a> <span class="kr">return</span> </span><span id="L-889"><a href="#L-889"><span class="linenos" data-line="889"></span></a> <span class="kr">end</span> </span><span id="L-890"><a href="#L-890"><span class="linenos" data-line="890"></span></a> <span class="kr">end</span> </span><span id="L-891"><a href="#L-891"><span class="linenos" data-line="891"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="ow">or</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-892"><a href="#L-892"><span class="linenos" data-line="892"></span></a> <span class="kr">return</span> </span><span id="L-893"><a href="#L-893"><span class="linenos" data-line="893"></span></a> <span class="kr">end</span> </span><span id="L-894"><a href="#L-894"><span class="linenos" data-line="894"></span></a> <span class="kd">local</span> <span class="n">era</span> <span class="o">=</span> <span class="n">era_text</span><span class="p">[</span><span class="n">options</span><span class="p">.</span><span class="n">era</span><span class="p">]</span> </span><span id="L-895"><a href="#L-895"><span class="linenos" data-line="895"></span></a> <span class="kr">if</span> <span class="n">era</span> <span class="ow">and</span> <span class="n">era</span><span class="p">.</span><span class="n">isbc</span> <span class="kr">then</span> </span><span id="L-896"><a href="#L-896"><span class="linenos" data-line="896"></span></a> <span class="n">date</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">date</span><span class="p">.</span><span class="n">year</span> </span><span id="L-897"><a href="#L-897"><span class="linenos" data-line="897"></span></a> <span class="kr">end</span> </span><span id="L-898"><a href="#L-898"><span class="linenos" data-line="898"></span></a> <span class="kr">return</span> <span class="n">date</span><span class="p">,</span> <span class="n">options</span> </span><span id="L-899"><a href="#L-899"><span class="linenos" data-line="899"></span></a><span class="kr">end</span> </span><span id="L-900"><a href="#L-900"><span class="linenos" data-line="900"></span></a> </span><span id="L-901"><a href="#L-901"><span class="linenos" data-line="901"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">autofill</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="n">date2</span><span class="p">)</span> </span><span id="L-902"><a href="#L-902"><span class="linenos" data-line="902"></span></a> <span class="c1">-- Fill any missing month or day in each date using the</span> </span><span id="L-903"><a href="#L-903"><span class="linenos" data-line="903"></span></a> <span class="c1">-- corresponding component from the other date, if present,</span> </span><span id="L-904"><a href="#L-904"><span class="linenos" data-line="904"></span></a> <span class="c1">-- or with 1 if both dates are missing the month or day.</span> </span><span id="L-905"><a href="#L-905"><span class="linenos" data-line="905"></span></a> <span class="c1">-- This gives a good result for calculating the difference</span> </span><span id="L-906"><a href="#L-906"><span class="linenos" data-line="906"></span></a> <span class="c1">-- between two partial dates when no range is wanted.</span> </span><span id="L-907"><a href="#L-907"><span class="linenos" data-line="907"></span></a> <span class="c1">-- Return filled date1, date2 (two full dates).</span> </span><span id="L-908"><a href="#L-908"><span class="linenos" data-line="908"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">filled</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-909"><a href="#L-909"><span class="linenos" data-line="909"></span></a> <span class="c1">-- Return date a filled, if necessary, with month and/or day from date b.</span> </span><span id="L-910"><a href="#L-910"><span class="linenos" data-line="910"></span></a> <span class="c1">-- The filled day is truncated to fit the number of days in the month.</span> </span><span id="L-911"><a href="#L-911"><span class="linenos" data-line="911"></span></a> <span class="kd">local</span> <span class="n">fillmonth</span><span class="p">,</span> <span class="n">fillday</span> </span><span id="L-912"><a href="#L-912"><span class="linenos" data-line="912"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">a</span><span class="p">.</span><span class="n">month</span> <span class="kr">then</span> </span><span id="L-913"><a href="#L-913"><span class="linenos" data-line="913"></span></a> <span class="n">fillmonth</span> <span class="o">=</span> <span class="n">b</span><span class="p">.</span><span class="n">month</span> <span class="ow">or</span> <span class="mi">1</span> </span><span id="L-914"><a href="#L-914"><span class="linenos" data-line="914"></span></a> <span class="kr">end</span> </span><span id="L-915"><a href="#L-915"><span class="linenos" data-line="915"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">a</span><span class="p">.</span><span class="n">day</span> <span class="kr">then</span> </span><span id="L-916"><a href="#L-916"><span class="linenos" data-line="916"></span></a> <span class="n">fillday</span> <span class="o">=</span> <span class="n">b</span><span class="p">.</span><span class="n">day</span> <span class="ow">or</span> <span class="mi">1</span> </span><span id="L-917"><a href="#L-917"><span class="linenos" data-line="917"></span></a> <span class="kr">end</span> </span><span id="L-918"><a href="#L-918"><span class="linenos" data-line="918"></span></a> <span class="kr">if</span> <span class="n">fillmonth</span> <span class="ow">or</span> <span class="n">fillday</span> <span class="kr">then</span> <span class="c1">-- need to create a new date</span> </span><span id="L-919"><a href="#L-919"><span class="linenos" data-line="919"></span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-920"><a href="#L-920"><span class="linenos" data-line="920"></span></a> <span class="n">month</span> <span class="o">=</span> <span class="n">fillmonth</span><span class="p">,</span> </span><span id="L-921"><a href="#L-921"><span class="linenos" data-line="921"></span></a> <span class="n">day</span> <span class="o">=</span> <span class="nb">math.min</span><span class="p">(</span><span class="n">fillday</span> <span class="ow">or</span> <span class="n">a</span><span class="p">.</span><span class="n">day</span><span class="p">,</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">fillmonth</span> <span class="ow">or</span> <span class="n">a</span><span class="p">.</span><span class="n">month</span><span class="p">,</span> <span class="n">a</span><span class="p">.</span><span class="n">calendar</span><span class="p">))</span> </span><span id="L-922"><a href="#L-922"><span class="linenos" data-line="922"></span></a> <span class="p">})</span> </span><span id="L-923"><a href="#L-923"><span class="linenos" data-line="923"></span></a> <span class="kr">end</span> </span><span id="L-924"><a href="#L-924"><span class="linenos" data-line="924"></span></a> <span class="kr">return</span> <span class="n">a</span> </span><span id="L-925"><a href="#L-925"><span class="linenos" data-line="925"></span></a> <span class="kr">end</span> </span><span id="L-926"><a href="#L-926"><span class="linenos" data-line="926"></span></a> <span class="kr">return</span> <span class="n">filled</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="n">date2</span><span class="p">),</span> <span class="n">filled</span><span class="p">(</span><span class="n">date2</span><span class="p">,</span> <span class="n">date1</span><span class="p">)</span> </span><span id="L-927"><a href="#L-927"><span class="linenos" data-line="927"></span></a><span class="kr">end</span> </span><span id="L-928"><a href="#L-928"><span class="linenos" data-line="928"></span></a> </span><span id="L-929"><a href="#L-929"><span class="linenos" data-line="929"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">date_add_sub</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">is_sub</span><span class="p">)</span> </span><span id="L-930"><a href="#L-930"><span class="linenos" data-line="930"></span></a> <span class="c1">-- Return a new date from calculating (lhs + rhs) or (lhs - rhs),</span> </span><span id="L-931"><a href="#L-931"><span class="linenos" data-line="931"></span></a> <span class="c1">-- or return nothing if invalid.</span> </span><span id="L-932"><a href="#L-932"><span class="linenos" data-line="932"></span></a> <span class="c1">-- The result is nil if the calculated date exceeds allowable limits.</span> </span><span id="L-933"><a href="#L-933"><span class="linenos" data-line="933"></span></a> <span class="c1">-- Caller ensures that lhs is a date; its properties are copied for the new date.</span> </span><span id="L-934"><a href="#L-934"><span class="linenos" data-line="934"></span></a> <span class="kr">if</span> <span class="n">lhs</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-935"><a href="#L-935"><span class="linenos" data-line="935"></span></a> <span class="c1">-- Adding to a partial is not supported.</span> </span><span id="L-936"><a href="#L-936"><span class="linenos" data-line="936"></span></a> <span class="c1">-- Can subtract a date or partial from a partial, but this is not called for that.</span> </span><span id="L-937"><a href="#L-937"><span class="linenos" data-line="937"></span></a> <span class="kr">return</span> </span><span id="L-938"><a href="#L-938"><span class="linenos" data-line="938"></span></a> <span class="kr">end</span> </span><span id="L-939"><a href="#L-939"><span class="linenos" data-line="939"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_prefix</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">word</span><span class="p">,</span> <span class="n">minlen</span><span class="p">)</span> </span><span id="L-940"><a href="#L-940"><span class="linenos" data-line="940"></span></a> <span class="kd">local</span> <span class="n">n</span> <span class="o">=</span> <span class="o">#</span><span class="n">text</span> </span><span id="L-941"><a href="#L-941"><span class="linenos" data-line="941"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">minlen</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">)</span> <span class="o"><=</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">n</span> <span class="o"><=</span> <span class="o">#</span><span class="n">word</span> <span class="ow">and</span> <span class="n">text</span> <span class="o">==</span> <span class="n">word</span><span class="p">:</span><span class="n">sub</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-942"><a href="#L-942"><span class="linenos" data-line="942"></span></a> <span class="kr">end</span> </span><span id="L-943"><a href="#L-943"><span class="linenos" data-line="943"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_days</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-944"><a href="#L-944"><span class="linenos" data-line="944"></span></a> <span class="kd">local</span> <span class="n">forcetime</span><span class="p">,</span> <span class="n">jd</span> </span><span id="L-945"><a href="#L-945"><span class="linenos" data-line="945"></span></a> <span class="kr">if</span> <span class="n">floor</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">==</span> <span class="n">n</span> <span class="kr">then</span> </span><span id="L-946"><a href="#L-946"><span class="linenos" data-line="946"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="n">lhs</span><span class="p">.</span><span class="n">jd</span> </span><span id="L-947"><a href="#L-947"><span class="linenos" data-line="947"></span></a> <span class="kr">else</span> </span><span id="L-948"><a href="#L-948"><span class="linenos" data-line="948"></span></a> <span class="n">forcetime</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">lhs</span><span class="p">.</span><span class="n">hastime</span> </span><span id="L-949"><a href="#L-949"><span class="linenos" data-line="949"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="n">lhs</span><span class="p">.</span><span class="n">jdz</span> </span><span id="L-950"><a href="#L-950"><span class="linenos" data-line="950"></span></a> <span class="kr">end</span> </span><span id="L-951"><a href="#L-951"><span class="linenos" data-line="951"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="n">jd</span> <span class="o">+</span> <span class="p">(</span><span class="n">is_sub</span> <span class="ow">and</span> <span class="o">-</span><span class="n">n</span> <span class="ow">or</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-952"><a href="#L-952"><span class="linenos" data-line="952"></span></a> <span class="kr">if</span> <span class="n">forcetime</span> <span class="kr">then</span> </span><span id="L-953"><a href="#L-953"><span class="linenos" data-line="953"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">jd</span><span class="p">)</span> </span><span id="L-954"><a href="#L-954"><span class="linenos" data-line="954"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">jd</span><span class="p">:</span><span class="n">find</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-955"><a href="#L-955"><span class="linenos" data-line="955"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="n">jd</span> <span class="o">..</span> <span class="s1">'.0'</span> </span><span id="L-956"><a href="#L-956"><span class="linenos" data-line="956"></span></a> <span class="kr">end</span> </span><span id="L-957"><a href="#L-957"><span class="linenos" data-line="957"></span></a> <span class="kr">end</span> </span><span id="L-958"><a href="#L-958"><span class="linenos" data-line="958"></span></a> <span class="kr">return</span> <span class="n">Date</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="s1">'juliandate'</span><span class="p">,</span> <span class="n">jd</span><span class="p">)</span> </span><span id="L-959"><a href="#L-959"><span class="linenos" data-line="959"></span></a> <span class="kr">end</span> </span><span id="L-960"><a href="#L-960"><span class="linenos" data-line="960"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'number'</span> <span class="kr">then</span> </span><span id="L-961"><a href="#L-961"><span class="linenos" data-line="961"></span></a> <span class="c1">-- Add/subtract days, including fractional days.</span> </span><span id="L-962"><a href="#L-962"><span class="linenos" data-line="962"></span></a> <span class="kr">return</span> <span class="n">do_days</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> </span><span id="L-963"><a href="#L-963"><span class="linenos" data-line="963"></span></a> <span class="kr">end</span> </span><span id="L-964"><a href="#L-964"><span class="linenos" data-line="964"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-965"><a href="#L-965"><span class="linenos" data-line="965"></span></a> <span class="c1">-- rhs is a single component like '26m' or '26 months' (with optional sign).</span> </span><span id="L-966"><a href="#L-966"><span class="linenos" data-line="966"></span></a> <span class="c1">-- Fractions like '3.25d' are accepted for the units which are handled as days.</span> </span><span id="L-967"><a href="#L-967"><span class="linenos" data-line="967"></span></a> <span class="kd">local</span> <span class="n">sign</span><span class="p">,</span> <span class="n">numstr</span><span class="p">,</span> <span class="n">id</span> <span class="o">=</span> <span class="n">rhs</span><span class="p">:</span><span class="n">match</span><span class="p">(</span><span class="s1">'^%s*([+-]?)([%d%.]+)%s*(%a+)$'</span><span class="p">)</span> </span><span id="L-968"><a href="#L-968"><span class="linenos" data-line="968"></span></a> <span class="kr">if</span> <span class="n">sign</span> <span class="kr">then</span> </span><span id="L-969"><a href="#L-969"><span class="linenos" data-line="969"></span></a> <span class="kr">if</span> <span class="n">sign</span> <span class="o">==</span> <span class="s1">'-'</span> <span class="kr">then</span> </span><span id="L-970"><a href="#L-970"><span class="linenos" data-line="970"></span></a> <span class="n">is_sub</span> <span class="o">=</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_sub</span> <span class="ow">and</span> <span class="kc">true</span> <span class="ow">or</span> <span class="kc">false</span><span class="p">)</span> </span><span id="L-971"><a href="#L-971"><span class="linenos" data-line="971"></span></a> <span class="kr">end</span> </span><span id="L-972"><a href="#L-972"><span class="linenos" data-line="972"></span></a> <span class="kd">local</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">days</span> </span><span id="L-973"><a href="#L-973"><span class="linenos" data-line="973"></span></a> <span class="kd">local</span> <span class="n">num</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">numstr</span><span class="p">)</span> </span><span id="L-974"><a href="#L-974"><span class="linenos" data-line="974"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">num</span> <span class="kr">then</span> </span><span id="L-975"><a href="#L-975"><span class="linenos" data-line="975"></span></a> <span class="kr">return</span> </span><span id="L-976"><a href="#L-976"><span class="linenos" data-line="976"></span></a> <span class="kr">end</span> </span><span id="L-977"><a href="#L-977"><span class="linenos" data-line="977"></span></a> <span class="n">id</span> <span class="o">=</span> <span class="n">id</span><span class="p">:</span><span class="n">lower</span><span class="p">()</span> </span><span id="L-978"><a href="#L-978"><span class="linenos" data-line="978"></span></a> <span class="kr">if</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'years'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-979"><a href="#L-979"><span class="linenos" data-line="979"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">num</span> </span><span id="L-980"><a href="#L-980"><span class="linenos" data-line="980"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-981"><a href="#L-981"><span class="linenos" data-line="981"></span></a> <span class="kr">elseif</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'months'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-982"><a href="#L-982"><span class="linenos" data-line="982"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">num</span> <span class="o">/</span> <span class="mi">12</span><span class="p">)</span> </span><span id="L-983"><a href="#L-983"><span class="linenos" data-line="983"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">num</span> <span class="o">%</span> <span class="mi">12</span> </span><span id="L-984"><a href="#L-984"><span class="linenos" data-line="984"></span></a> <span class="kr">elseif</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'weeks'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-985"><a href="#L-985"><span class="linenos" data-line="985"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">num</span> <span class="o">*</span> <span class="mi">7</span> </span><span id="L-986"><a href="#L-986"><span class="linenos" data-line="986"></span></a> <span class="kr">elseif</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'days'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-987"><a href="#L-987"><span class="linenos" data-line="987"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">num</span> </span><span id="L-988"><a href="#L-988"><span class="linenos" data-line="988"></span></a> <span class="kr">elseif</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'hours'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-989"><a href="#L-989"><span class="linenos" data-line="989"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">num</span> <span class="o">/</span> <span class="mi">24</span> </span><span id="L-990"><a href="#L-990"><span class="linenos" data-line="990"></span></a> <span class="kr">elseif</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'minutes'</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-991"><a href="#L-991"><span class="linenos" data-line="991"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">num</span> <span class="o">/</span> <span class="p">(</span><span class="mi">24</span> <span class="o">*</span> <span class="mi">60</span><span class="p">)</span> </span><span id="L-992"><a href="#L-992"><span class="linenos" data-line="992"></span></a> <span class="kr">elseif</span> <span class="n">is_prefix</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="s1">'seconds'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-993"><a href="#L-993"><span class="linenos" data-line="993"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">num</span> <span class="o">/</span> <span class="p">(</span><span class="mi">24</span> <span class="o">*</span> <span class="mi">3600</span><span class="p">)</span> </span><span id="L-994"><a href="#L-994"><span class="linenos" data-line="994"></span></a> <span class="kr">else</span> </span><span id="L-995"><a href="#L-995"><span class="linenos" data-line="995"></span></a> <span class="kr">return</span> </span><span id="L-996"><a href="#L-996"><span class="linenos" data-line="996"></span></a> <span class="kr">end</span> </span><span id="L-997"><a href="#L-997"><span class="linenos" data-line="997"></span></a> <span class="kr">if</span> <span class="n">days</span> <span class="kr">then</span> </span><span id="L-998"><a href="#L-998"><span class="linenos" data-line="998"></span></a> <span class="kr">return</span> <span class="n">do_days</span><span class="p">(</span><span class="n">days</span><span class="p">)</span> </span><span id="L-999"><a href="#L-999"><span class="linenos" data-line="999"></span></a> <span class="kr">end</span> </span><span id="L-1000"><a href="#L-1000"><span class="linenos" data-line="1000"></span></a> <span class="kr">if</span> <span class="n">numstr</span><span class="p">:</span><span class="n">find</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1001"><a href="#L-1001"><span class="linenos" data-line="1001"></span></a> <span class="kr">return</span> </span><span id="L-1002"><a href="#L-1002"><span class="linenos" data-line="1002"></span></a> <span class="kr">end</span> </span><span id="L-1003"><a href="#L-1003"><span class="linenos" data-line="1003"></span></a> <span class="kr">if</span> <span class="n">is_sub</span> <span class="kr">then</span> </span><span id="L-1004"><a href="#L-1004"><span class="linenos" data-line="1004"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="o">-</span><span class="n">y</span> </span><span id="L-1005"><a href="#L-1005"><span class="linenos" data-line="1005"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="o">-</span><span class="n">m</span> </span><span id="L-1006"><a href="#L-1006"><span class="linenos" data-line="1006"></span></a> <span class="kr">end</span> </span><span id="L-1007"><a href="#L-1007"><span class="linenos" data-line="1007"></span></a> <span class="nb">assert</span><span class="p">(</span><span class="o">-</span><span class="mi">11</span> <span class="o"><=</span> <span class="n">m</span> <span class="ow">and</span> <span class="n">m</span> <span class="o"><=</span> <span class="mi">11</span><span class="p">)</span> </span><span id="L-1008"><a href="#L-1008"><span class="linenos" data-line="1008"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">lhs</span><span class="p">.</span><span class="n">year</span> <span class="o">+</span> <span class="n">y</span> </span><span id="L-1009"><a href="#L-1009"><span class="linenos" data-line="1009"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">lhs</span><span class="p">.</span><span class="n">month</span> <span class="o">+</span> <span class="n">m</span> </span><span id="L-1010"><a href="#L-1010"><span class="linenos" data-line="1010"></span></a> <span class="kr">if</span> <span class="n">m</span> <span class="o">></span> <span class="mi">12</span> <span class="kr">then</span> </span><span id="L-1011"><a href="#L-1011"><span class="linenos" data-line="1011"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1012"><a href="#L-1012"><span class="linenos" data-line="1012"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">m</span> <span class="o">-</span> <span class="mi">12</span> </span><span id="L-1013"><a href="#L-1013"><span class="linenos" data-line="1013"></span></a> <span class="kr">elseif</span> <span class="n">m</span> <span class="o"><</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-1014"><a href="#L-1014"><span class="linenos" data-line="1014"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-1015"><a href="#L-1015"><span class="linenos" data-line="1015"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">12</span> </span><span id="L-1016"><a href="#L-1016"><span class="linenos" data-line="1016"></span></a> <span class="kr">end</span> </span><span id="L-1017"><a href="#L-1017"><span class="linenos" data-line="1017"></span></a> <span class="kd">local</span> <span class="n">d</span> <span class="o">=</span> <span class="nb">math.min</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">day</span><span class="p">,</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">calendar</span><span class="p">))</span> </span><span id="L-1018"><a href="#L-1018"><span class="linenos" data-line="1018"></span></a> <span class="kr">return</span> <span class="n">Date</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span> </span><span id="L-1019"><a href="#L-1019"><span class="linenos" data-line="1019"></span></a> <span class="kr">end</span> </span><span id="L-1020"><a href="#L-1020"><span class="linenos" data-line="1020"></span></a> <span class="kr">end</span> </span><span id="L-1021"><a href="#L-1021"><span class="linenos" data-line="1021"></span></a> <span class="kr">if</span> <span class="n">is_diff</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1022"><a href="#L-1022"><span class="linenos" data-line="1022"></span></a> <span class="kd">local</span> <span class="n">days</span> <span class="o">=</span> <span class="n">rhs</span><span class="p">.</span><span class="n">age_days</span> </span><span id="L-1023"><a href="#L-1023"><span class="linenos" data-line="1023"></span></a> <span class="kr">if</span> <span class="p">(</span><span class="n">is_sub</span> <span class="ow">or</span> <span class="kc">false</span><span class="p">)</span> <span class="o">~=</span> <span class="p">(</span><span class="n">rhs</span><span class="p">.</span><span class="n">isnegative</span> <span class="ow">or</span> <span class="kc">false</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1024"><a href="#L-1024"><span class="linenos" data-line="1024"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="o">-</span><span class="n">days</span> </span><span id="L-1025"><a href="#L-1025"><span class="linenos" data-line="1025"></span></a> <span class="kr">end</span> </span><span id="L-1026"><a href="#L-1026"><span class="linenos" data-line="1026"></span></a> <span class="kr">return</span> <span class="n">lhs</span> <span class="o">+</span> <span class="n">days</span> </span><span id="L-1027"><a href="#L-1027"><span class="linenos" data-line="1027"></span></a> <span class="kr">end</span> </span><span id="L-1028"><a href="#L-1028"><span class="linenos" data-line="1028"></span></a><span class="kr">end</span> </span><span id="L-1029"><a href="#L-1029"><span class="linenos" data-line="1029"></span></a> </span><span id="L-1030"><a href="#L-1030"><span class="linenos" data-line="1030"></span></a><span class="kd">local</span> <span class="n">full_date_only</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-1031"><a href="#L-1031"><span class="linenos" data-line="1031"></span></a> <span class="n">dayabbr</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1032"><a href="#L-1032"><span class="linenos" data-line="1032"></span></a> <span class="n">dayname</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1033"><a href="#L-1033"><span class="linenos" data-line="1033"></span></a> <span class="n">dow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1034"><a href="#L-1034"><span class="linenos" data-line="1034"></span></a> <span class="n">dayofweek</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1035"><a href="#L-1035"><span class="linenos" data-line="1035"></span></a> <span class="n">dowiso</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1036"><a href="#L-1036"><span class="linenos" data-line="1036"></span></a> <span class="n">dayofweekiso</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1037"><a href="#L-1037"><span class="linenos" data-line="1037"></span></a> <span class="n">dayofyear</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1038"><a href="#L-1038"><span class="linenos" data-line="1038"></span></a> <span class="n">gsd</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1039"><a href="#L-1039"><span class="linenos" data-line="1039"></span></a> <span class="n">juliandate</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1040"><a href="#L-1040"><span class="linenos" data-line="1040"></span></a> <span class="n">jd</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1041"><a href="#L-1041"><span class="linenos" data-line="1041"></span></a> <span class="n">jdz</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1042"><a href="#L-1042"><span class="linenos" data-line="1042"></span></a> <span class="n">jdnoon</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> </span><span id="L-1043"><a href="#L-1043"><span class="linenos" data-line="1043"></span></a><span class="p">}</span> </span><span id="L-1044"><a href="#L-1044"><span class="linenos" data-line="1044"></span></a> </span><span id="L-1045"><a href="#L-1045"><span class="linenos" data-line="1045"></span></a><span class="c1">-- Metatable for a date's calculated fields.</span> </span><span id="L-1046"><a href="#L-1046"><span class="linenos" data-line="1046"></span></a><span class="kd">local</span> <span class="n">datemt</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-1047"><a href="#L-1047"><span class="linenos" data-line="1047"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> </span><span id="L-1048"><a href="#L-1048"><span class="linenos" data-line="1048"></span></a> <span class="kr">if</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s1">'partial'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1049"><a href="#L-1049"><span class="linenos" data-line="1049"></span></a> <span class="kr">if</span> <span class="n">full_date_only</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="kr">then</span> <span class="kr">return</span> <span class="kr">end</span> </span><span id="L-1050"><a href="#L-1050"><span class="linenos" data-line="1050"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'monthabbr'</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'monthdays'</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'monthname'</span> <span class="kr">then</span> </span><span id="L-1051"><a href="#L-1051"><span class="linenos" data-line="1051"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="n">month</span> <span class="kr">then</span> <span class="kr">return</span> <span class="kr">end</span> </span><span id="L-1052"><a href="#L-1052"><span class="linenos" data-line="1052"></span></a> <span class="kr">end</span> </span><span id="L-1053"><a href="#L-1053"><span class="linenos" data-line="1053"></span></a> <span class="kr">end</span> </span><span id="L-1054"><a href="#L-1054"><span class="linenos" data-line="1054"></span></a> <span class="kd">local</span> <span class="n">value</span> </span><span id="L-1055"><a href="#L-1055"><span class="linenos" data-line="1055"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dayabbr'</span> <span class="kr">then</span> </span><span id="L-1056"><a href="#L-1056"><span class="linenos" data-line="1056"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">day_info</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">dow</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1057"><a href="#L-1057"><span class="linenos" data-line="1057"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dayname'</span> <span class="kr">then</span> </span><span id="L-1058"><a href="#L-1058"><span class="linenos" data-line="1058"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">day_info</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">dow</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> </span><span id="L-1059"><a href="#L-1059"><span class="linenos" data-line="1059"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dow'</span> <span class="kr">then</span> </span><span id="L-1060"><a href="#L-1060"><span class="linenos" data-line="1060"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">jdnoon</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="mi">7</span> <span class="c1">-- day-of-week 0=Sun to 6=Sat</span> </span><span id="L-1061"><a href="#L-1061"><span class="linenos" data-line="1061"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dayofweek'</span> <span class="kr">then</span> </span><span id="L-1062"><a href="#L-1062"><span class="linenos" data-line="1062"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">dow</span> </span><span id="L-1063"><a href="#L-1063"><span class="linenos" data-line="1063"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dowiso'</span> <span class="kr">then</span> </span><span id="L-1064"><a href="#L-1064"><span class="linenos" data-line="1064"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">jdnoon</span> <span class="o">%</span> <span class="mi">7</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1">-- ISO day-of-week 1=Mon to 7=Sun</span> </span><span id="L-1065"><a href="#L-1065"><span class="linenos" data-line="1065"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dayofweekiso'</span> <span class="kr">then</span> </span><span id="L-1066"><a href="#L-1066"><span class="linenos" data-line="1066"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">dowiso</span> </span><span id="L-1067"><a href="#L-1067"><span class="linenos" data-line="1067"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'dayofyear'</span> <span class="kr">then</span> </span><span id="L-1068"><a href="#L-1068"><span class="linenos" data-line="1068"></span></a> <span class="kd">local</span> <span class="n">first</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">calendar</span><span class="p">).</span><span class="n">jdnoon</span> </span><span id="L-1069"><a href="#L-1069"><span class="linenos" data-line="1069"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">jdnoon</span> <span class="o">-</span> <span class="n">first</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1">-- day-of-year 1 to 366</span> </span><span id="L-1070"><a href="#L-1070"><span class="linenos" data-line="1070"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'era'</span> <span class="kr">then</span> </span><span id="L-1071"><a href="#L-1071"><span class="linenos" data-line="1071"></span></a> <span class="c1">-- Era text (never a negative sign) from year and options.</span> </span><span id="L-1072"><a href="#L-1072"><span class="linenos" data-line="1072"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">get_era_for_year</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">options</span><span class="p">.</span><span class="n">era</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">year</span><span class="p">)</span> </span><span id="L-1073"><a href="#L-1073"><span class="linenos" data-line="1073"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'format'</span> <span class="kr">then</span> </span><span id="L-1074"><a href="#L-1074"><span class="linenos" data-line="1074"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">options</span><span class="p">.</span><span class="n">format</span> <span class="ow">or</span> <span class="s1">'dmy'</span> </span><span id="L-1075"><a href="#L-1075"><span class="linenos" data-line="1075"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'gsd'</span> <span class="kr">then</span> </span><span id="L-1076"><a href="#L-1076"><span class="linenos" data-line="1076"></span></a> <span class="c1">-- GSD = 1 from 00:00:00 to 23:59:59 on 1 January 1 AD Gregorian calendar,</span> </span><span id="L-1077"><a href="#L-1077"><span class="linenos" data-line="1077"></span></a> <span class="c1">-- which is from jd 1721425.5 to 1721426.49999.</span> </span><span id="L-1078"><a href="#L-1078"><span class="linenos" data-line="1078"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">jd</span> <span class="o">-</span> <span class="mf">1721424.5</span><span class="p">)</span> </span><span id="L-1079"><a href="#L-1079"><span class="linenos" data-line="1079"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'juliandate'</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'jd'</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'jdz'</span> <span class="kr">then</span> </span><span id="L-1080"><a href="#L-1080"><span class="linenos" data-line="1080"></span></a> <span class="kd">local</span> <span class="n">jd</span><span class="p">,</span> <span class="n">jdz</span> <span class="o">=</span> <span class="n">julian_date</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1081"><a href="#L-1081"><span class="linenos" data-line="1081"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s1">'juliandate'</span><span class="p">,</span> <span class="n">jd</span><span class="p">)</span> </span><span id="L-1082"><a href="#L-1082"><span class="linenos" data-line="1082"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s1">'jd'</span><span class="p">,</span> <span class="n">jd</span><span class="p">)</span> </span><span id="L-1083"><a href="#L-1083"><span class="linenos" data-line="1083"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s1">'jdz'</span><span class="p">,</span> <span class="n">jdz</span><span class="p">)</span> </span><span id="L-1084"><a href="#L-1084"><span class="linenos" data-line="1084"></span></a> <span class="kr">return</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'jdz'</span> <span class="ow">and</span> <span class="n">jdz</span> <span class="ow">or</span> <span class="n">jd</span> </span><span id="L-1085"><a href="#L-1085"><span class="linenos" data-line="1085"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'jdnoon'</span> <span class="kr">then</span> </span><span id="L-1086"><a href="#L-1086"><span class="linenos" data-line="1086"></span></a> <span class="c1">-- Julian date at noon (an integer) on the calendar day when jd occurs.</span> </span><span id="L-1087"><a href="#L-1087"><span class="linenos" data-line="1087"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">jd</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span> </span><span id="L-1088"><a href="#L-1088"><span class="linenos" data-line="1088"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'isleapyear'</span> <span class="kr">then</span> </span><span id="L-1089"><a href="#L-1089"><span class="linenos" data-line="1089"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">is_leap_year</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> </span><span id="L-1090"><a href="#L-1090"><span class="linenos" data-line="1090"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'monthabbr'</span> <span class="kr">then</span> </span><span id="L-1091"><a href="#L-1091"><span class="linenos" data-line="1091"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">month_info</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">month</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1092"><a href="#L-1092"><span class="linenos" data-line="1092"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'monthdays'</span> <span class="kr">then</span> </span><span id="L-1093"><a href="#L-1093"><span class="linenos" data-line="1093"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">month</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> </span><span id="L-1094"><a href="#L-1094"><span class="linenos" data-line="1094"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'monthname'</span> <span class="kr">then</span> </span><span id="L-1095"><a href="#L-1095"><span class="linenos" data-line="1095"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">month_info</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">month</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> </span><span id="L-1096"><a href="#L-1096"><span class="linenos" data-line="1096"></span></a> <span class="kr">end</span> </span><span id="L-1097"><a href="#L-1097"><span class="linenos" data-line="1097"></span></a> <span class="kr">if</span> <span class="n">value</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1098"><a href="#L-1098"><span class="linenos" data-line="1098"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> </span><span id="L-1099"><a href="#L-1099"><span class="linenos" data-line="1099"></span></a> <span class="kr">return</span> <span class="n">value</span> </span><span id="L-1100"><a href="#L-1100"><span class="linenos" data-line="1100"></span></a> <span class="kr">end</span> </span><span id="L-1101"><a href="#L-1101"><span class="linenos" data-line="1101"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1102"><a href="#L-1102"><span class="linenos" data-line="1102"></span></a><span class="p">}</span> </span><span id="L-1103"><a href="#L-1103"><span class="linenos" data-line="1103"></span></a> </span><span id="L-1104"><a href="#L-1104"><span class="linenos" data-line="1104"></span></a><span class="c1">-- Date operators.</span> </span><span id="L-1105"><a href="#L-1105"><span class="linenos" data-line="1105"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">mt_date_add</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1106"><a href="#L-1106"><span class="linenos" data-line="1106"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_date</span><span class="p">(</span><span class="n">lhs</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1107"><a href="#L-1107"><span class="linenos" data-line="1107"></span></a> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">lhs</span> <span class="c1">-- put date on left (it must be a date for this to have been called)</span> </span><span id="L-1108"><a href="#L-1108"><span class="linenos" data-line="1108"></span></a> <span class="kr">end</span> </span><span id="L-1109"><a href="#L-1109"><span class="linenos" data-line="1109"></span></a> <span class="kr">return</span> <span class="n">date_add_sub</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1110"><a href="#L-1110"><span class="linenos" data-line="1110"></span></a><span class="kr">end</span> </span><span id="L-1111"><a href="#L-1111"><span class="linenos" data-line="1111"></span></a> </span><span id="L-1112"><a href="#L-1112"><span class="linenos" data-line="1112"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">mt_date_sub</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1113"><a href="#L-1113"><span class="linenos" data-line="1113"></span></a> <span class="kr">if</span> <span class="n">is_date</span><span class="p">(</span><span class="n">lhs</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1114"><a href="#L-1114"><span class="linenos" data-line="1114"></span></a> <span class="kr">if</span> <span class="n">is_date</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1115"><a href="#L-1115"><span class="linenos" data-line="1115"></span></a> <span class="kr">return</span> <span class="n">DateDiff</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1116"><a href="#L-1116"><span class="linenos" data-line="1116"></span></a> <span class="kr">end</span> </span><span id="L-1117"><a href="#L-1117"><span class="linenos" data-line="1117"></span></a> <span class="kr">return</span> <span class="n">date_add_sub</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-1118"><a href="#L-1118"><span class="linenos" data-line="1118"></span></a> <span class="kr">end</span> </span><span id="L-1119"><a href="#L-1119"><span class="linenos" data-line="1119"></span></a><span class="kr">end</span> </span><span id="L-1120"><a href="#L-1120"><span class="linenos" data-line="1120"></span></a> </span><span id="L-1121"><a href="#L-1121"><span class="linenos" data-line="1121"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">mt_date_concat</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1122"><a href="#L-1122"><span class="linenos" data-line="1122"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">lhs</span><span class="p">)</span> <span class="o">..</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> </span><span id="L-1123"><a href="#L-1123"><span class="linenos" data-line="1123"></span></a><span class="kr">end</span> </span><span id="L-1124"><a href="#L-1124"><span class="linenos" data-line="1124"></span></a> </span><span id="L-1125"><a href="#L-1125"><span class="linenos" data-line="1125"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">mt_date_tostring</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1126"><a href="#L-1126"><span class="linenos" data-line="1126"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">text</span><span class="p">()</span> </span><span id="L-1127"><a href="#L-1127"><span class="linenos" data-line="1127"></span></a><span class="kr">end</span> </span><span id="L-1128"><a href="#L-1128"><span class="linenos" data-line="1128"></span></a> </span><span id="L-1129"><a href="#L-1129"><span class="linenos" data-line="1129"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">mt_date_eq</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1130"><a href="#L-1130"><span class="linenos" data-line="1130"></span></a> <span class="c1">-- Return true if dates identify same date/time where, for example,</span> </span><span id="L-1131"><a href="#L-1131"><span class="linenos" data-line="1131"></span></a> <span class="c1">-- Date(-4712, 1, 1, 'Julian') == Date(-4713, 11, 24, 'Gregorian') is true.</span> </span><span id="L-1132"><a href="#L-1132"><span class="linenos" data-line="1132"></span></a> <span class="c1">-- This is called only if lhs and rhs have the same type and the same metamethod.</span> </span><span id="L-1133"><a href="#L-1133"><span class="linenos" data-line="1133"></span></a> <span class="kr">if</span> <span class="n">lhs</span><span class="p">.</span><span class="n">partial</span> <span class="ow">or</span> <span class="n">rhs</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1134"><a href="#L-1134"><span class="linenos" data-line="1134"></span></a> <span class="c1">-- One date is partial; the other is a partial or a full date.</span> </span><span id="L-1135"><a href="#L-1135"><span class="linenos" data-line="1135"></span></a> <span class="c1">-- The months may both be nil, but must be the same.</span> </span><span id="L-1136"><a href="#L-1136"><span class="linenos" data-line="1136"></span></a> <span class="kr">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">lhs</span><span class="p">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">lhs</span><span class="p">.</span><span class="n">calendar</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">calendar</span> </span><span id="L-1137"><a href="#L-1137"><span class="linenos" data-line="1137"></span></a> <span class="kr">end</span> </span><span id="L-1138"><a href="#L-1138"><span class="linenos" data-line="1138"></span></a> <span class="kr">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">jdz</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">jdz</span> </span><span id="L-1139"><a href="#L-1139"><span class="linenos" data-line="1139"></span></a><span class="kr">end</span> </span><span id="L-1140"><a href="#L-1140"><span class="linenos" data-line="1140"></span></a> </span><span id="L-1141"><a href="#L-1141"><span class="linenos" data-line="1141"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">mt_date_lt</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1142"><a href="#L-1142"><span class="linenos" data-line="1142"></span></a> <span class="c1">-- Return true if lhs < rhs, for example,</span> </span><span id="L-1143"><a href="#L-1143"><span class="linenos" data-line="1143"></span></a> <span class="c1">-- Date('1 Jan 2016') < Date('06:00 1 Jan 2016') is true.</span> </span><span id="L-1144"><a href="#L-1144"><span class="linenos" data-line="1144"></span></a> <span class="c1">-- This is called only if lhs and rhs have the same type and the same metamethod.</span> </span><span id="L-1145"><a href="#L-1145"><span class="linenos" data-line="1145"></span></a> <span class="kr">if</span> <span class="n">lhs</span><span class="p">.</span><span class="n">partial</span> <span class="ow">or</span> <span class="n">rhs</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1146"><a href="#L-1146"><span class="linenos" data-line="1146"></span></a> <span class="c1">-- One date is partial; the other is a partial or a full date.</span> </span><span id="L-1147"><a href="#L-1147"><span class="linenos" data-line="1147"></span></a> <span class="kr">if</span> <span class="n">lhs</span><span class="p">.</span><span class="n">calendar</span> <span class="o">~=</span> <span class="n">rhs</span><span class="p">.</span><span class="n">calendar</span> <span class="kr">then</span> </span><span id="L-1148"><a href="#L-1148"><span class="linenos" data-line="1148"></span></a> <span class="kr">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">calendar</span> <span class="o">==</span> <span class="s1">'Julian'</span> </span><span id="L-1149"><a href="#L-1149"><span class="linenos" data-line="1149"></span></a> <span class="kr">end</span> </span><span id="L-1150"><a href="#L-1150"><span class="linenos" data-line="1150"></span></a> <span class="kr">if</span> <span class="n">lhs</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1151"><a href="#L-1151"><span class="linenos" data-line="1151"></span></a> <span class="n">lhs</span> <span class="o">=</span> <span class="n">lhs</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">first</span> </span><span id="L-1152"><a href="#L-1152"><span class="linenos" data-line="1152"></span></a> <span class="kr">end</span> </span><span id="L-1153"><a href="#L-1153"><span class="linenos" data-line="1153"></span></a> <span class="kr">if</span> <span class="n">rhs</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1154"><a href="#L-1154"><span class="linenos" data-line="1154"></span></a> <span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">first</span> </span><span id="L-1155"><a href="#L-1155"><span class="linenos" data-line="1155"></span></a> <span class="kr">end</span> </span><span id="L-1156"><a href="#L-1156"><span class="linenos" data-line="1156"></span></a> <span class="kr">end</span> </span><span id="L-1157"><a href="#L-1157"><span class="linenos" data-line="1157"></span></a> <span class="kr">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">jdz</span> <span class="o"><</span> <span class="n">rhs</span><span class="p">.</span><span class="n">jdz</span> </span><span id="L-1158"><a href="#L-1158"><span class="linenos" data-line="1158"></span></a><span class="kr">end</span> </span><span id="L-1159"><a href="#L-1159"><span class="linenos" data-line="1159"></span></a> </span><span id="L-1160"><a href="#L-1160"><span class="linenos" data-line="1160"></span></a><span class="cm">--[[ Examples of syntax to construct a date:</span> </span><span id="L-1161"><a href="#L-1161"><span class="linenos" data-line="1161"></span></a><span class="cm">Date(y, m, d, 'julian') default calendar is 'gregorian'</span> </span><span id="L-1162"><a href="#L-1162"><span class="linenos" data-line="1162"></span></a><span class="cm">Date(y, m, d, H, M, S, 'julian')</span> </span><span id="L-1163"><a href="#L-1163"><span class="linenos" data-line="1163"></span></a><span class="cm">Date('juliandate', jd, 'julian') if jd contains "." text output includes H:M:S</span> </span><span id="L-1164"><a href="#L-1164"><span class="linenos" data-line="1164"></span></a><span class="cm">Date('currentdate')</span> </span><span id="L-1165"><a href="#L-1165"><span class="linenos" data-line="1165"></span></a><span class="cm">Date('currentdatetime')</span> </span><span id="L-1166"><a href="#L-1166"><span class="linenos" data-line="1166"></span></a><span class="cm">Date('1 April 1995', 'julian') parse date from text</span> </span><span id="L-1167"><a href="#L-1167"><span class="linenos" data-line="1167"></span></a><span class="cm">Date('1 April 1995 AD', 'julian') using an era sets a flag to do the same for output</span> </span><span id="L-1168"><a href="#L-1168"><span class="linenos" data-line="1168"></span></a><span class="cm">Date('04:30:59 1 April 1995', 'julian')</span> </span><span id="L-1169"><a href="#L-1169"><span class="linenos" data-line="1169"></span></a><span class="cm">Date(date) copy of an existing date</span> </span><span id="L-1170"><a href="#L-1170"><span class="linenos" data-line="1170"></span></a><span class="cm">Date(date, t) same, updated with y,m,d,H,M,S fields from table t</span> </span><span id="L-1171"><a href="#L-1171"><span class="linenos" data-line="1171"></span></a><span class="cm">Date(t) date with y,m,d,H,M,S fields from table t</span> </span><span id="L-1172"><a href="#L-1172"><span class="linenos" data-line="1172"></span></a><span class="cm">]]</span> </span><span id="L-1173"><a href="#L-1173"><span class="linenos" data-line="1173"></span></a><span class="kr">function</span> <span class="nf">Date</span><span class="p">(...)</span> <span class="c1">-- for forward declaration above</span> </span><span id="L-1174"><a href="#L-1174"><span class="linenos" data-line="1174"></span></a> <span class="c1">-- Return a table holding a date assuming a uniform calendar always applies</span> </span><span id="L-1175"><a href="#L-1175"><span class="linenos" data-line="1175"></span></a> <span class="c1">-- (proleptic Gregorian calendar or proleptic Julian calendar), or</span> </span><span id="L-1176"><a href="#L-1176"><span class="linenos" data-line="1176"></span></a> <span class="c1">-- return nothing if date is invalid.</span> </span><span id="L-1177"><a href="#L-1177"><span class="linenos" data-line="1177"></span></a> <span class="c1">-- A partial date has a valid year, however its month may be nil, and</span> </span><span id="L-1178"><a href="#L-1178"><span class="linenos" data-line="1178"></span></a> <span class="c1">-- its day and time fields are nil.</span> </span><span id="L-1179"><a href="#L-1179"><span class="linenos" data-line="1179"></span></a> <span class="c1">-- Field partial is set to false (if a full date) or a table (if a partial date).</span> </span><span id="L-1180"><a href="#L-1180"><span class="linenos" data-line="1180"></span></a> <span class="kd">local</span> <span class="n">calendars</span> <span class="o">=</span> <span class="p">{</span> <span class="n">julian</span> <span class="o">=</span> <span class="s1">'Julian'</span><span class="p">,</span> <span class="n">gregorian</span> <span class="o">=</span> <span class="s1">'Gregorian'</span> <span class="p">}</span> </span><span id="L-1181"><a href="#L-1181"><span class="linenos" data-line="1181"></span></a> <span class="kd">local</span> <span class="n">newdate</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-1182"><a href="#L-1182"><span class="linenos" data-line="1182"></span></a> <span class="n">_id</span> <span class="o">=</span> <span class="n">uniq</span><span class="p">,</span> </span><span id="L-1183"><a href="#L-1183"><span class="linenos" data-line="1183"></span></a> <span class="n">calendar</span> <span class="o">=</span> <span class="s1">'Gregorian'</span><span class="p">,</span> <span class="c1">-- default is Gregorian calendar</span> </span><span id="L-1184"><a href="#L-1184"><span class="linenos" data-line="1184"></span></a> <span class="n">hastime</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">-- true if input sets a time</span> </span><span id="L-1185"><a href="#L-1185"><span class="linenos" data-line="1185"></span></a> <span class="n">hour</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">-- always set hour/minute/second so don't have to handle nil</span> </span><span id="L-1186"><a href="#L-1186"><span class="linenos" data-line="1186"></span></a> <span class="n">minute</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> </span><span id="L-1187"><a href="#L-1187"><span class="linenos" data-line="1187"></span></a> <span class="n">second</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> </span><span id="L-1188"><a href="#L-1188"><span class="linenos" data-line="1188"></span></a> <span class="n">options</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-1189"><a href="#L-1189"><span class="linenos" data-line="1189"></span></a> <span class="n">list</span> <span class="o">=</span> <span class="n">_date_list</span><span class="p">,</span> </span><span id="L-1190"><a href="#L-1190"><span class="linenos" data-line="1190"></span></a> <span class="n">subtract</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-1191"><a href="#L-1191"><span class="linenos" data-line="1191"></span></a> <span class="kr">return</span> <span class="n">DateDiff</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-1192"><a href="#L-1192"><span class="linenos" data-line="1192"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1193"><a href="#L-1193"><span class="linenos" data-line="1193"></span></a> <span class="n">text</span> <span class="o">=</span> <span class="n">_date_text</span><span class="p">,</span> </span><span id="L-1194"><a href="#L-1194"><span class="linenos" data-line="1194"></span></a> <span class="p">}</span> </span><span id="L-1195"><a href="#L-1195"><span class="linenos" data-line="1195"></span></a> <span class="kd">local</span> <span class="n">argtype</span><span class="p">,</span> <span class="n">datetext</span><span class="p">,</span> <span class="n">is_copy</span><span class="p">,</span> <span class="n">jd_number</span><span class="p">,</span> <span class="n">tnums</span> </span><span id="L-1196"><a href="#L-1196"><span class="linenos" data-line="1196"></span></a> <span class="kd">local</span> <span class="n">numindex</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1197"><a href="#L-1197"><span class="linenos" data-line="1197"></span></a> <span class="kd">local</span> <span class="n">numfields</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'year'</span><span class="p">,</span> <span class="s1">'month'</span><span class="p">,</span> <span class="s1">'day'</span><span class="p">,</span> <span class="s1">'hour'</span><span class="p">,</span> <span class="s1">'minute'</span><span class="p">,</span> <span class="s1">'second'</span> <span class="p">}</span> </span><span id="L-1198"><a href="#L-1198"><span class="linenos" data-line="1198"></span></a> <span class="kd">local</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-1199"><a href="#L-1199"><span class="linenos" data-line="1199"></span></a> <span class="kr">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">v</span> <span class="kr">in</span> <span class="nb">ipairs</span><span class="p">({...})</span> <span class="kr">do</span> </span><span id="L-1200"><a href="#L-1200"><span class="linenos" data-line="1200"></span></a> <span class="n">v</span> <span class="o">=</span> <span class="n">strip_to_nil</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> </span><span id="L-1201"><a href="#L-1201"><span class="linenos" data-line="1201"></span></a> <span class="kd">local</span> <span class="n">vlower</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="ow">and</span> <span class="n">v</span><span class="p">:</span><span class="n">lower</span><span class="p">()</span> <span class="ow">or</span> <span class="kc">nil</span> </span><span id="L-1202"><a href="#L-1202"><span class="linenos" data-line="1202"></span></a> <span class="kr">if</span> <span class="n">v</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1203"><a href="#L-1203"><span class="linenos" data-line="1203"></span></a> <span class="c1">-- Ignore empty arguments after stripping so modules can directly pass template parameters.</span> </span><span id="L-1204"><a href="#L-1204"><span class="linenos" data-line="1204"></span></a> <span class="kr">elseif</span> <span class="n">calendars</span><span class="p">[</span><span class="n">vlower</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-1205"><a href="#L-1205"><span class="linenos" data-line="1205"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">calendar</span> <span class="o">=</span> <span class="n">calendars</span><span class="p">[</span><span class="n">vlower</span><span class="p">]</span> </span><span id="L-1206"><a href="#L-1206"><span class="linenos" data-line="1206"></span></a> <span class="kr">elseif</span> <span class="n">vlower</span> <span class="o">==</span> <span class="s1">'partial'</span> <span class="kr">then</span> </span><span id="L-1207"><a href="#L-1207"><span class="linenos" data-line="1207"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1208"><a href="#L-1208"><span class="linenos" data-line="1208"></span></a> <span class="kr">elseif</span> <span class="n">vlower</span> <span class="o">==</span> <span class="s1">'fix'</span> <span class="kr">then</span> </span><span id="L-1209"><a href="#L-1209"><span class="linenos" data-line="1209"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">want_fix</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1210"><a href="#L-1210"><span class="linenos" data-line="1210"></span></a> <span class="kr">elseif</span> <span class="n">is_date</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1211"><a href="#L-1211"><span class="linenos" data-line="1211"></span></a> <span class="c1">-- Copy existing date (items can be overridden by other arguments).</span> </span><span id="L-1212"><a href="#L-1212"><span class="linenos" data-line="1212"></span></a> <span class="kr">if</span> <span class="n">is_copy</span> <span class="ow">or</span> <span class="n">tnums</span> <span class="kr">then</span> </span><span id="L-1213"><a href="#L-1213"><span class="linenos" data-line="1213"></span></a> <span class="kr">return</span> </span><span id="L-1214"><a href="#L-1214"><span class="linenos" data-line="1214"></span></a> <span class="kr">end</span> </span><span id="L-1215"><a href="#L-1215"><span class="linenos" data-line="1215"></span></a> <span class="n">is_copy</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1216"><a href="#L-1216"><span class="linenos" data-line="1216"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">calendar</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">calendar</span> </span><span id="L-1217"><a href="#L-1217"><span class="linenos" data-line="1217"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">partial</span> </span><span id="L-1218"><a href="#L-1218"><span class="linenos" data-line="1218"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hastime</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">hastime</span> </span><span id="L-1219"><a href="#L-1219"><span class="linenos" data-line="1219"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">options</span> </span><span id="L-1220"><a href="#L-1220"><span class="linenos" data-line="1220"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">year</span> </span><span id="L-1221"><a href="#L-1221"><span class="linenos" data-line="1221"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">month</span> </span><span id="L-1222"><a href="#L-1222"><span class="linenos" data-line="1222"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">day</span> </span><span id="L-1223"><a href="#L-1223"><span class="linenos" data-line="1223"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">hour</span> </span><span id="L-1224"><a href="#L-1224"><span class="linenos" data-line="1224"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">minute</span> </span><span id="L-1225"><a href="#L-1225"><span class="linenos" data-line="1225"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">second</span> </span><span id="L-1226"><a href="#L-1226"><span class="linenos" data-line="1226"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-1227"><a href="#L-1227"><span class="linenos" data-line="1227"></span></a> <span class="kr">if</span> <span class="n">tnums</span> <span class="kr">then</span> </span><span id="L-1228"><a href="#L-1228"><span class="linenos" data-line="1228"></span></a> <span class="kr">return</span> </span><span id="L-1229"><a href="#L-1229"><span class="linenos" data-line="1229"></span></a> <span class="kr">end</span> </span><span id="L-1230"><a href="#L-1230"><span class="linenos" data-line="1230"></span></a> <span class="n">tnums</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-1231"><a href="#L-1231"><span class="linenos" data-line="1231"></span></a> <span class="kd">local</span> <span class="n">tfields</span> <span class="o">=</span> <span class="p">{</span> <span class="n">year</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">day</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">hour</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">minute</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">second</span><span class="o">=</span><span class="mi">2</span> <span class="p">}</span> </span><span id="L-1232"><a href="#L-1232"><span class="linenos" data-line="1232"></span></a> <span class="kr">for</span> <span class="n">tk</span><span class="p">,</span> <span class="n">tv</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1233"><a href="#L-1233"><span class="linenos" data-line="1233"></span></a> <span class="kr">if</span> <span class="n">tfields</span><span class="p">[</span><span class="n">tk</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-1234"><a href="#L-1234"><span class="linenos" data-line="1234"></span></a> <span class="n">tnums</span><span class="p">[</span><span class="n">tk</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">tv</span><span class="p">)</span> </span><span id="L-1235"><a href="#L-1235"><span class="linenos" data-line="1235"></span></a> <span class="kr">end</span> </span><span id="L-1236"><a href="#L-1236"><span class="linenos" data-line="1236"></span></a> <span class="kr">if</span> <span class="n">tfields</span><span class="p">[</span><span class="n">tk</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span> <span class="kr">then</span> </span><span id="L-1237"><a href="#L-1237"><span class="linenos" data-line="1237"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hastime</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1238"><a href="#L-1238"><span class="linenos" data-line="1238"></span></a> <span class="kr">end</span> </span><span id="L-1239"><a href="#L-1239"><span class="linenos" data-line="1239"></span></a> <span class="kr">end</span> </span><span id="L-1240"><a href="#L-1240"><span class="linenos" data-line="1240"></span></a> <span class="kr">else</span> </span><span id="L-1241"><a href="#L-1241"><span class="linenos" data-line="1241"></span></a> <span class="kd">local</span> <span class="n">num</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> </span><span id="L-1242"><a href="#L-1242"><span class="linenos" data-line="1242"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">num</span> <span class="ow">and</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'setdate'</span> <span class="ow">and</span> <span class="n">numindex</span> <span class="o">==</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-1243"><a href="#L-1243"><span class="linenos" data-line="1243"></span></a> <span class="n">num</span> <span class="o">=</span> <span class="n">month_number</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> </span><span id="L-1244"><a href="#L-1244"><span class="linenos" data-line="1244"></span></a> <span class="kr">end</span> </span><span id="L-1245"><a href="#L-1245"><span class="linenos" data-line="1245"></span></a> <span class="kr">if</span> <span class="n">num</span> <span class="kr">then</span> </span><span id="L-1246"><a href="#L-1246"><span class="linenos" data-line="1246"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">argtype</span> <span class="kr">then</span> </span><span id="L-1247"><a href="#L-1247"><span class="linenos" data-line="1247"></span></a> <span class="n">argtype</span> <span class="o">=</span> <span class="s1">'setdate'</span> </span><span id="L-1248"><a href="#L-1248"><span class="linenos" data-line="1248"></span></a> <span class="kr">end</span> </span><span id="L-1249"><a href="#L-1249"><span class="linenos" data-line="1249"></span></a> <span class="kr">if</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'setdate'</span> <span class="ow">and</span> <span class="n">numindex</span> <span class="o"><</span> <span class="mi">6</span> <span class="kr">then</span> </span><span id="L-1250"><a href="#L-1250"><span class="linenos" data-line="1250"></span></a> <span class="n">numindex</span> <span class="o">=</span> <span class="n">numindex</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1251"><a href="#L-1251"><span class="linenos" data-line="1251"></span></a> <span class="n">numbers</span><span class="p">[</span><span class="n">numfields</span><span class="p">[</span><span class="n">numindex</span><span class="p">]]</span> <span class="o">=</span> <span class="n">num</span> </span><span id="L-1252"><a href="#L-1252"><span class="linenos" data-line="1252"></span></a> <span class="kr">elseif</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'juliandate'</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">jd_number</span> <span class="kr">then</span> </span><span id="L-1253"><a href="#L-1253"><span class="linenos" data-line="1253"></span></a> <span class="n">jd_number</span> <span class="o">=</span> <span class="n">num</span> </span><span id="L-1254"><a href="#L-1254"><span class="linenos" data-line="1254"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-1255"><a href="#L-1255"><span class="linenos" data-line="1255"></span></a> <span class="kr">if</span> <span class="n">v</span><span class="p">:</span><span class="n">find</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1256"><a href="#L-1256"><span class="linenos" data-line="1256"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hastime</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1257"><a href="#L-1257"><span class="linenos" data-line="1257"></span></a> <span class="kr">end</span> </span><span id="L-1258"><a href="#L-1258"><span class="linenos" data-line="1258"></span></a> <span class="kr">elseif</span> <span class="n">num</span> <span class="o">~=</span> <span class="n">floor</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1259"><a href="#L-1259"><span class="linenos" data-line="1259"></span></a> <span class="c1">-- The given value was a number. The time will be used</span> </span><span id="L-1260"><a href="#L-1260"><span class="linenos" data-line="1260"></span></a> <span class="c1">-- if the fractional part is nonzero.</span> </span><span id="L-1261"><a href="#L-1261"><span class="linenos" data-line="1261"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hastime</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1262"><a href="#L-1262"><span class="linenos" data-line="1262"></span></a> <span class="kr">end</span> </span><span id="L-1263"><a href="#L-1263"><span class="linenos" data-line="1263"></span></a> <span class="kr">else</span> </span><span id="L-1264"><a href="#L-1264"><span class="linenos" data-line="1264"></span></a> <span class="kr">return</span> </span><span id="L-1265"><a href="#L-1265"><span class="linenos" data-line="1265"></span></a> <span class="kr">end</span> </span><span id="L-1266"><a href="#L-1266"><span class="linenos" data-line="1266"></span></a> <span class="kr">elseif</span> <span class="n">argtype</span> <span class="kr">then</span> </span><span id="L-1267"><a href="#L-1267"><span class="linenos" data-line="1267"></span></a> <span class="kr">return</span> </span><span id="L-1268"><a href="#L-1268"><span class="linenos" data-line="1268"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'string'</span> <span class="kr">then</span> </span><span id="L-1269"><a href="#L-1269"><span class="linenos" data-line="1269"></span></a> <span class="kr">if</span> <span class="n">v</span> <span class="o">==</span> <span class="s1">'currentdate'</span> <span class="ow">or</span> <span class="n">v</span> <span class="o">==</span> <span class="s1">'currentdatetime'</span> <span class="ow">or</span> <span class="n">v</span> <span class="o">==</span> <span class="s1">'juliandate'</span> <span class="kr">then</span> </span><span id="L-1270"><a href="#L-1270"><span class="linenos" data-line="1270"></span></a> <span class="n">argtype</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-1271"><a href="#L-1271"><span class="linenos" data-line="1271"></span></a> <span class="kr">else</span> </span><span id="L-1272"><a href="#L-1272"><span class="linenos" data-line="1272"></span></a> <span class="n">argtype</span> <span class="o">=</span> <span class="s1">'datetext'</span> </span><span id="L-1273"><a href="#L-1273"><span class="linenos" data-line="1273"></span></a> <span class="n">datetext</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-1274"><a href="#L-1274"><span class="linenos" data-line="1274"></span></a> <span class="kr">end</span> </span><span id="L-1275"><a href="#L-1275"><span class="linenos" data-line="1275"></span></a> <span class="kr">else</span> </span><span id="L-1276"><a href="#L-1276"><span class="linenos" data-line="1276"></span></a> <span class="kr">return</span> </span><span id="L-1277"><a href="#L-1277"><span class="linenos" data-line="1277"></span></a> <span class="kr">end</span> </span><span id="L-1278"><a href="#L-1278"><span class="linenos" data-line="1278"></span></a> <span class="kr">end</span> </span><span id="L-1279"><a href="#L-1279"><span class="linenos" data-line="1279"></span></a> <span class="kr">end</span> </span><span id="L-1280"><a href="#L-1280"><span class="linenos" data-line="1280"></span></a> <span class="kr">if</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'datetext'</span> <span class="kr">then</span> </span><span id="L-1281"><a href="#L-1281"><span class="linenos" data-line="1281"></span></a> <span class="kr">if</span> <span class="n">tnums</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">set_date_from_numbers</span><span class="p">(</span><span class="n">newdate</span><span class="p">,</span> <span class="n">extract_date</span><span class="p">(</span><span class="n">newdate</span><span class="p">,</span> <span class="n">datetext</span><span class="p">))</span> <span class="kr">then</span> </span><span id="L-1282"><a href="#L-1282"><span class="linenos" data-line="1282"></span></a> <span class="kr">return</span> </span><span id="L-1283"><a href="#L-1283"><span class="linenos" data-line="1283"></span></a> <span class="kr">end</span> </span><span id="L-1284"><a href="#L-1284"><span class="linenos" data-line="1284"></span></a> <span class="kr">elseif</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'juliandate'</span> <span class="kr">then</span> </span><span id="L-1285"><a href="#L-1285"><span class="linenos" data-line="1285"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-1286"><a href="#L-1286"><span class="linenos" data-line="1286"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">jd</span> <span class="o">=</span> <span class="n">jd_number</span> </span><span id="L-1287"><a href="#L-1287"><span class="linenos" data-line="1287"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">set_date_from_jd</span><span class="p">(</span><span class="n">newdate</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1288"><a href="#L-1288"><span class="linenos" data-line="1288"></span></a> <span class="kr">return</span> </span><span id="L-1289"><a href="#L-1289"><span class="linenos" data-line="1289"></span></a> <span class="kr">end</span> </span><span id="L-1290"><a href="#L-1290"><span class="linenos" data-line="1290"></span></a> <span class="kr">elseif</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'currentdate'</span> <span class="ow">or</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'currentdatetime'</span> <span class="kr">then</span> </span><span id="L-1291"><a href="#L-1291"><span class="linenos" data-line="1291"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-1292"><a href="#L-1292"><span class="linenos" data-line="1292"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">year</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">year</span> </span><span id="L-1293"><a href="#L-1293"><span class="linenos" data-line="1293"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">month</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">month</span> </span><span id="L-1294"><a href="#L-1294"><span class="linenos" data-line="1294"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">day</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">day</span> </span><span id="L-1295"><a href="#L-1295"><span class="linenos" data-line="1295"></span></a> <span class="kr">if</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'currentdatetime'</span> <span class="kr">then</span> </span><span id="L-1296"><a href="#L-1296"><span class="linenos" data-line="1296"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hour</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">hour</span> </span><span id="L-1297"><a href="#L-1297"><span class="linenos" data-line="1297"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">minute</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">minute</span> </span><span id="L-1298"><a href="#L-1298"><span class="linenos" data-line="1298"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">second</span> </span><span id="L-1299"><a href="#L-1299"><span class="linenos" data-line="1299"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">hastime</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1300"><a href="#L-1300"><span class="linenos" data-line="1300"></span></a> <span class="kr">end</span> </span><span id="L-1301"><a href="#L-1301"><span class="linenos" data-line="1301"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">calendar</span> <span class="o">=</span> <span class="s1">'Gregorian'</span> <span class="c1">-- ignore any given calendar name</span> </span><span id="L-1302"><a href="#L-1302"><span class="linenos" data-line="1302"></span></a> <span class="kr">elseif</span> <span class="n">argtype</span> <span class="o">==</span> <span class="s1">'setdate'</span> <span class="kr">then</span> </span><span id="L-1303"><a href="#L-1303"><span class="linenos" data-line="1303"></span></a> <span class="kr">if</span> <span class="n">tnums</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">set_date_from_numbers</span><span class="p">(</span><span class="n">newdate</span><span class="p">,</span> <span class="n">numbers</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1304"><a href="#L-1304"><span class="linenos" data-line="1304"></span></a> <span class="kr">return</span> </span><span id="L-1305"><a href="#L-1305"><span class="linenos" data-line="1305"></span></a> <span class="kr">end</span> </span><span id="L-1306"><a href="#L-1306"><span class="linenos" data-line="1306"></span></a> <span class="kr">elseif</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_copy</span> <span class="ow">or</span> <span class="n">tnums</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1307"><a href="#L-1307"><span class="linenos" data-line="1307"></span></a> <span class="kr">return</span> </span><span id="L-1308"><a href="#L-1308"><span class="linenos" data-line="1308"></span></a> <span class="kr">end</span> </span><span id="L-1309"><a href="#L-1309"><span class="linenos" data-line="1309"></span></a> <span class="kr">if</span> <span class="n">tnums</span> <span class="kr">then</span> </span><span id="L-1310"><a href="#L-1310"><span class="linenos" data-line="1310"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">jd</span> <span class="o">=</span> <span class="kc">nil</span> <span class="c1">-- force recalculation in case jd was set before changes from tnums</span> </span><span id="L-1311"><a href="#L-1311"><span class="linenos" data-line="1311"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">set_date_from_numbers</span><span class="p">(</span><span class="n">newdate</span><span class="p">,</span> <span class="n">tnums</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1312"><a href="#L-1312"><span class="linenos" data-line="1312"></span></a> <span class="kr">return</span> </span><span id="L-1313"><a href="#L-1313"><span class="linenos" data-line="1313"></span></a> <span class="kr">end</span> </span><span id="L-1314"><a href="#L-1314"><span class="linenos" data-line="1314"></span></a> <span class="kr">end</span> </span><span id="L-1315"><a href="#L-1315"><span class="linenos" data-line="1315"></span></a> <span class="kr">if</span> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1316"><a href="#L-1316"><span class="linenos" data-line="1316"></span></a> <span class="kd">local</span> <span class="n">year</span> <span class="o">=</span> <span class="n">newdate</span><span class="p">.</span><span class="n">year</span> </span><span id="L-1317"><a href="#L-1317"><span class="linenos" data-line="1317"></span></a> <span class="kd">local</span> <span class="n">month</span> <span class="o">=</span> <span class="n">newdate</span><span class="p">.</span><span class="n">month</span> </span><span id="L-1318"><a href="#L-1318"><span class="linenos" data-line="1318"></span></a> <span class="kd">local</span> <span class="n">first</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">newdate</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> </span><span id="L-1319"><a href="#L-1319"><span class="linenos" data-line="1319"></span></a> <span class="n">month</span> <span class="o">=</span> <span class="n">month</span> <span class="ow">or</span> <span class="mi">12</span> </span><span id="L-1320"><a href="#L-1320"><span class="linenos" data-line="1320"></span></a> <span class="kd">local</span> <span class="n">last</span> <span class="o">=</span> <span class="n">Date</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">),</span> <span class="n">newdate</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> </span><span id="L-1321"><a href="#L-1321"><span class="linenos" data-line="1321"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="p">{</span> <span class="n">first</span> <span class="o">=</span> <span class="n">first</span><span class="p">,</span> <span class="n">last</span> <span class="o">=</span> <span class="n">last</span> <span class="p">}</span> </span><span id="L-1322"><a href="#L-1322"><span class="linenos" data-line="1322"></span></a> <span class="kr">else</span> </span><span id="L-1323"><a href="#L-1323"><span class="linenos" data-line="1323"></span></a> <span class="n">newdate</span><span class="p">.</span><span class="n">partial</span> <span class="o">=</span> <span class="kc">false</span> <span class="c1">-- avoid index lookup</span> </span><span id="L-1324"><a href="#L-1324"><span class="linenos" data-line="1324"></span></a> <span class="kr">end</span> </span><span id="L-1325"><a href="#L-1325"><span class="linenos" data-line="1325"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">newdate</span><span class="p">,</span> <span class="n">datemt</span><span class="p">)</span> </span><span id="L-1326"><a href="#L-1326"><span class="linenos" data-line="1326"></span></a> <span class="kd">local</span> <span class="n">readonly</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-1327"><a href="#L-1327"><span class="linenos" data-line="1327"></span></a> <span class="kd">local</span> <span class="n">mt</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-1328"><a href="#L-1328"><span class="linenos" data-line="1328"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="n">newdate</span><span class="p">,</span> </span><span id="L-1329"><a href="#L-1329"><span class="linenos" data-line="1329"></span></a> <span class="n">__newindex</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="nb">error</span><span class="p">(</span><span class="s1">'date.'</span> <span class="o">..</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="o">..</span> <span class="s1">' is read-only'</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1330"><a href="#L-1330"><span class="linenos" data-line="1330"></span></a> <span class="n">__add</span> <span class="o">=</span> <span class="n">mt_date_add</span><span class="p">,</span> </span><span id="L-1331"><a href="#L-1331"><span class="linenos" data-line="1331"></span></a> <span class="n">__sub</span> <span class="o">=</span> <span class="n">mt_date_sub</span><span class="p">,</span> </span><span id="L-1332"><a href="#L-1332"><span class="linenos" data-line="1332"></span></a> <span class="n">__concat</span> <span class="o">=</span> <span class="n">mt_date_concat</span><span class="p">,</span> </span><span id="L-1333"><a href="#L-1333"><span class="linenos" data-line="1333"></span></a> <span class="n">__tostring</span> <span class="o">=</span> <span class="n">mt_date_tostring</span><span class="p">,</span> </span><span id="L-1334"><a href="#L-1334"><span class="linenos" data-line="1334"></span></a> <span class="n">__eq</span> <span class="o">=</span> <span class="n">mt_date_eq</span><span class="p">,</span> </span><span id="L-1335"><a href="#L-1335"><span class="linenos" data-line="1335"></span></a> <span class="n">__lt</span> <span class="o">=</span> <span class="n">mt_date_lt</span><span class="p">,</span> </span><span id="L-1336"><a href="#L-1336"><span class="linenos" data-line="1336"></span></a> <span class="p">}</span> </span><span id="L-1337"><a href="#L-1337"><span class="linenos" data-line="1337"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">readonly</span><span class="p">,</span> <span class="n">mt</span><span class="p">)</span> </span><span id="L-1338"><a href="#L-1338"><span class="linenos" data-line="1338"></span></a><span class="kr">end</span> </span><span id="L-1339"><a href="#L-1339"><span class="linenos" data-line="1339"></span></a> </span><span id="L-1340"><a href="#L-1340"><span class="linenos" data-line="1340"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">_diff_age</span><span class="p">(</span><span class="n">diff</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-1341"><a href="#L-1341"><span class="linenos" data-line="1341"></span></a> <span class="c1">-- Return a tuple of integer values from diff as specified by code, except that</span> </span><span id="L-1342"><a href="#L-1342"><span class="linenos" data-line="1342"></span></a> <span class="c1">-- each integer may be a list of two integers for a diff with a partial date, or</span> </span><span id="L-1343"><a href="#L-1343"><span class="linenos" data-line="1343"></span></a> <span class="c1">-- return nil if the code is not supported.</span> </span><span id="L-1344"><a href="#L-1344"><span class="linenos" data-line="1344"></span></a> <span class="c1">-- If want round, the least significant unit is rounded to nearest whole unit.</span> </span><span id="L-1345"><a href="#L-1345"><span class="linenos" data-line="1345"></span></a> <span class="c1">-- For a duration, an extra day is added.</span> </span><span id="L-1346"><a href="#L-1346"><span class="linenos" data-line="1346"></span></a> <span class="kd">local</span> <span class="n">wantround</span><span class="p">,</span> <span class="n">wantduration</span><span class="p">,</span> <span class="n">wantrange</span> </span><span id="L-1347"><a href="#L-1347"><span class="linenos" data-line="1347"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-1348"><a href="#L-1348"><span class="linenos" data-line="1348"></span></a> <span class="n">wantround</span> <span class="o">=</span> <span class="n">options</span><span class="p">.</span><span class="n">round</span> </span><span id="L-1349"><a href="#L-1349"><span class="linenos" data-line="1349"></span></a> <span class="n">wantduration</span> <span class="o">=</span> <span class="n">options</span><span class="p">.</span><span class="n">duration</span> </span><span id="L-1350"><a href="#L-1350"><span class="linenos" data-line="1350"></span></a> <span class="n">wantrange</span> <span class="o">=</span> <span class="n">options</span><span class="p">.</span><span class="n">range</span> </span><span id="L-1351"><a href="#L-1351"><span class="linenos" data-line="1351"></span></a> <span class="kr">else</span> </span><span id="L-1352"><a href="#L-1352"><span class="linenos" data-line="1352"></span></a> <span class="n">wantround</span> <span class="o">=</span> <span class="n">options</span> </span><span id="L-1353"><a href="#L-1353"><span class="linenos" data-line="1353"></span></a> <span class="kr">end</span> </span><span id="L-1354"><a href="#L-1354"><span class="linenos" data-line="1354"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_diff</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1355"><a href="#L-1355"><span class="linenos" data-line="1355"></span></a> <span class="kd">local</span> <span class="n">f</span> <span class="o">=</span> <span class="n">wantduration</span> <span class="ow">and</span> <span class="s1">'duration'</span> <span class="ow">or</span> <span class="s1">'age'</span> </span><span id="L-1356"><a href="#L-1356"><span class="linenos" data-line="1356"></span></a> <span class="nb">error</span><span class="p">(</span><span class="n">f</span> <span class="o">..</span> <span class="s1">': need a date difference (use "diff:'</span> <span class="o">..</span> <span class="n">f</span> <span class="o">..</span> <span class="s1">'()" with a colon)'</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> </span><span id="L-1357"><a href="#L-1357"><span class="linenos" data-line="1357"></span></a> <span class="kr">end</span> </span><span id="L-1358"><a href="#L-1358"><span class="linenos" data-line="1358"></span></a> <span class="kr">if</span> <span class="n">diff</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1359"><a href="#L-1359"><span class="linenos" data-line="1359"></span></a> <span class="c1">-- Ignore wantround, wantduration.</span> </span><span id="L-1360"><a href="#L-1360"><span class="linenos" data-line="1360"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">choose</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> </span><span id="L-1361"><a href="#L-1361"><span class="linenos" data-line="1361"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-1362"><a href="#L-1362"><span class="linenos" data-line="1362"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">wantrange</span> <span class="ow">or</span> <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">v</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-1363"><a href="#L-1363"><span class="linenos" data-line="1363"></span></a> <span class="c1">-- Example: Date('partial', 2005) - Date('partial', 2001) gives</span> </span><span id="L-1364"><a href="#L-1364"><span class="linenos" data-line="1364"></span></a> <span class="c1">-- diff.years = { 3, 4 } to show the range of possible results.</span> </span><span id="L-1365"><a href="#L-1365"><span class="linenos" data-line="1365"></span></a> <span class="c1">-- If do not want a range, choose the second value as more expected.</span> </span><span id="L-1366"><a href="#L-1366"><span class="linenos" data-line="1366"></span></a> <span class="kr">return</span> <span class="n">v</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> </span><span id="L-1367"><a href="#L-1367"><span class="linenos" data-line="1367"></span></a> <span class="kr">end</span> </span><span id="L-1368"><a href="#L-1368"><span class="linenos" data-line="1368"></span></a> <span class="kr">end</span> </span><span id="L-1369"><a href="#L-1369"><span class="linenos" data-line="1369"></span></a> <span class="kr">return</span> <span class="n">v</span> </span><span id="L-1370"><a href="#L-1370"><span class="linenos" data-line="1370"></span></a> <span class="kr">end</span> </span><span id="L-1371"><a href="#L-1371"><span class="linenos" data-line="1371"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ym'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymd'</span> <span class="kr">then</span> </span><span id="L-1372"><a href="#L-1372"><span class="linenos" data-line="1372"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">wantrange</span> <span class="ow">and</span> <span class="n">diff</span><span class="p">.</span><span class="n">iszero</span> <span class="kr">then</span> </span><span id="L-1373"><a href="#L-1373"><span class="linenos" data-line="1373"></span></a> <span class="c1">-- This avoids an unexpected result such as</span> </span><span id="L-1374"><a href="#L-1374"><span class="linenos" data-line="1374"></span></a> <span class="c1">-- Date('partial', 2001) - Date('partial', 2001)</span> </span><span id="L-1375"><a href="#L-1375"><span class="linenos" data-line="1375"></span></a> <span class="c1">-- giving diff = { years = 0, months = { 0, 11 } }</span> </span><span id="L-1376"><a href="#L-1376"><span class="linenos" data-line="1376"></span></a> <span class="c1">-- which would be reported as 0 years and 11 months.</span> </span><span id="L-1377"><a href="#L-1377"><span class="linenos" data-line="1377"></span></a> <span class="kr">return</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> </span><span id="L-1378"><a href="#L-1378"><span class="linenos" data-line="1378"></span></a> <span class="kr">end</span> </span><span id="L-1379"><a href="#L-1379"><span class="linenos" data-line="1379"></span></a> <span class="kr">return</span> <span class="n">choose</span><span class="p">(</span><span class="n">diff</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">years</span><span class="p">),</span> <span class="n">choose</span><span class="p">(</span><span class="n">diff</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">months</span><span class="p">)</span> </span><span id="L-1380"><a href="#L-1380"><span class="linenos" data-line="1380"></span></a> <span class="kr">end</span> </span><span id="L-1381"><a href="#L-1381"><span class="linenos" data-line="1381"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'y'</span> <span class="kr">then</span> </span><span id="L-1382"><a href="#L-1382"><span class="linenos" data-line="1382"></span></a> <span class="kr">return</span> <span class="n">choose</span><span class="p">(</span><span class="n">diff</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">years</span><span class="p">)</span> </span><span id="L-1383"><a href="#L-1383"><span class="linenos" data-line="1383"></span></a> <span class="kr">end</span> </span><span id="L-1384"><a href="#L-1384"><span class="linenos" data-line="1384"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'m'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'w'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'d'</span> <span class="kr">then</span> </span><span id="L-1385"><a href="#L-1385"><span class="linenos" data-line="1385"></span></a> <span class="kr">return</span> <span class="n">choose</span><span class="p">({</span> <span class="n">diff</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">mindiff</span><span class="p">:</span><span class="n">age</span><span class="p">(</span><span class="n">code</span><span class="p">),</span> <span class="n">diff</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">maxdiff</span><span class="p">:</span><span class="n">age</span><span class="p">(</span><span class="n">code</span><span class="p">)</span> <span class="p">})</span> </span><span id="L-1386"><a href="#L-1386"><span class="linenos" data-line="1386"></span></a> <span class="kr">end</span> </span><span id="L-1387"><a href="#L-1387"><span class="linenos" data-line="1387"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-1388"><a href="#L-1388"><span class="linenos" data-line="1388"></span></a> <span class="kr">end</span> </span><span id="L-1389"><a href="#L-1389"><span class="linenos" data-line="1389"></span></a> <span class="kd">local</span> <span class="n">extra_days</span> <span class="o">=</span> <span class="n">wantduration</span> <span class="ow">and</span> <span class="mi">1</span> <span class="ow">or</span> <span class="mi">0</span> </span><span id="L-1390"><a href="#L-1390"><span class="linenos" data-line="1390"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'wd'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'w'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'d'</span> <span class="kr">then</span> </span><span id="L-1391"><a href="#L-1391"><span class="linenos" data-line="1391"></span></a> <span class="kd">local</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">wantround</span> <span class="ow">and</span> <span class="mf">0.5</span> <span class="ow">or</span> <span class="mi">0</span> </span><span id="L-1392"><a href="#L-1392"><span class="linenos" data-line="1392"></span></a> <span class="kd">local</span> <span class="n">days</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">age_days</span> <span class="o">+</span> <span class="n">extra_days</span> </span><span id="L-1393"><a href="#L-1393"><span class="linenos" data-line="1393"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'wd'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'d'</span> <span class="kr">then</span> </span><span id="L-1394"><a href="#L-1394"><span class="linenos" data-line="1394"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">days</span> <span class="o">+</span> <span class="n">offset</span><span class="p">)</span> </span><span id="L-1395"><a href="#L-1395"><span class="linenos" data-line="1395"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'d'</span> <span class="kr">then</span> </span><span id="L-1396"><a href="#L-1396"><span class="linenos" data-line="1396"></span></a> <span class="kr">return</span> <span class="n">days</span> </span><span id="L-1397"><a href="#L-1397"><span class="linenos" data-line="1397"></span></a> <span class="kr">end</span> </span><span id="L-1398"><a href="#L-1398"><span class="linenos" data-line="1398"></span></a> <span class="kr">return</span> <span class="n">floor</span><span class="p">(</span><span class="n">days</span><span class="o">/</span><span class="mi">7</span><span class="p">),</span> <span class="n">days</span> <span class="o">%</span> <span class="mi">7</span> </span><span id="L-1399"><a href="#L-1399"><span class="linenos" data-line="1399"></span></a> <span class="kr">end</span> </span><span id="L-1400"><a href="#L-1400"><span class="linenos" data-line="1400"></span></a> <span class="kr">return</span> <span class="n">floor</span><span class="p">(</span><span class="n">days</span><span class="o">/</span><span class="mi">7</span> <span class="o">+</span> <span class="n">offset</span><span class="p">)</span> </span><span id="L-1401"><a href="#L-1401"><span class="linenos" data-line="1401"></span></a> <span class="kr">end</span> </span><span id="L-1402"><a href="#L-1402"><span class="linenos" data-line="1402"></span></a> <span class="kd">local</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">hours</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">minutes</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">seconds</span> </span><span id="L-1403"><a href="#L-1403"><span class="linenos" data-line="1403"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dh'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dhm'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dhms'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'h'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'hm'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'hms'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'M'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'s'</span> <span class="kr">then</span> </span><span id="L-1404"><a href="#L-1404"><span class="linenos" data-line="1404"></span></a> <span class="kd">local</span> <span class="n">days</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">diff</span><span class="p">.</span><span class="n">age_days</span> <span class="o">+</span> <span class="n">extra_days</span><span class="p">)</span> </span><span id="L-1405"><a href="#L-1405"><span class="linenos" data-line="1405"></span></a> <span class="kd">local</span> <span class="n">inc_hour</span> </span><span id="L-1406"><a href="#L-1406"><span class="linenos" data-line="1406"></span></a> <span class="kr">if</span> <span class="n">wantround</span> <span class="kr">then</span> </span><span id="L-1407"><a href="#L-1407"><span class="linenos" data-line="1407"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dh'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'h'</span> <span class="kr">then</span> </span><span id="L-1408"><a href="#L-1408"><span class="linenos" data-line="1408"></span></a> <span class="kr">if</span> <span class="n">M</span> <span class="o">>=</span> <span class="mi">30</span> <span class="kr">then</span> </span><span id="L-1409"><a href="#L-1409"><span class="linenos" data-line="1409"></span></a> <span class="n">inc_hour</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1410"><a href="#L-1410"><span class="linenos" data-line="1410"></span></a> <span class="kr">end</span> </span><span id="L-1411"><a href="#L-1411"><span class="linenos" data-line="1411"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dhm'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'hm'</span> <span class="kr">then</span> </span><span id="L-1412"><a href="#L-1412"><span class="linenos" data-line="1412"></span></a> <span class="kr">if</span> <span class="n">S</span> <span class="o">>=</span> <span class="mi">30</span> <span class="kr">then</span> </span><span id="L-1413"><a href="#L-1413"><span class="linenos" data-line="1413"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1414"><a href="#L-1414"><span class="linenos" data-line="1414"></span></a> <span class="kr">if</span> <span class="n">M</span> <span class="o">>=</span> <span class="mi">60</span> <span class="kr">then</span> </span><span id="L-1415"><a href="#L-1415"><span class="linenos" data-line="1415"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1416"><a href="#L-1416"><span class="linenos" data-line="1416"></span></a> <span class="n">inc_hour</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1417"><a href="#L-1417"><span class="linenos" data-line="1417"></span></a> <span class="kr">end</span> </span><span id="L-1418"><a href="#L-1418"><span class="linenos" data-line="1418"></span></a> <span class="kr">end</span> </span><span id="L-1419"><a href="#L-1419"><span class="linenos" data-line="1419"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'M'</span> <span class="kr">then</span> </span><span id="L-1420"><a href="#L-1420"><span class="linenos" data-line="1420"></span></a> <span class="kr">if</span> <span class="n">S</span> <span class="o">>=</span> <span class="mi">30</span> <span class="kr">then</span> </span><span id="L-1421"><a href="#L-1421"><span class="linenos" data-line="1421"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1422"><a href="#L-1422"><span class="linenos" data-line="1422"></span></a> <span class="kr">end</span> </span><span id="L-1423"><a href="#L-1423"><span class="linenos" data-line="1423"></span></a> <span class="kr">else</span> </span><span id="L-1424"><a href="#L-1424"><span class="linenos" data-line="1424"></span></a> <span class="c1">-- Nothing needed because S is an integer.</span> </span><span id="L-1425"><a href="#L-1425"><span class="linenos" data-line="1425"></span></a> <span class="kr">end</span> </span><span id="L-1426"><a href="#L-1426"><span class="linenos" data-line="1426"></span></a> <span class="kr">if</span> <span class="n">inc_hour</span> <span class="kr">then</span> </span><span id="L-1427"><a href="#L-1427"><span class="linenos" data-line="1427"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="n">H</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1428"><a href="#L-1428"><span class="linenos" data-line="1428"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="o">>=</span> <span class="mi">24</span> <span class="kr">then</span> </span><span id="L-1429"><a href="#L-1429"><span class="linenos" data-line="1429"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1430"><a href="#L-1430"><span class="linenos" data-line="1430"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">days</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1431"><a href="#L-1431"><span class="linenos" data-line="1431"></span></a> <span class="kr">end</span> </span><span id="L-1432"><a href="#L-1432"><span class="linenos" data-line="1432"></span></a> <span class="kr">end</span> </span><span id="L-1433"><a href="#L-1433"><span class="linenos" data-line="1433"></span></a> <span class="kr">end</span> </span><span id="L-1434"><a href="#L-1434"><span class="linenos" data-line="1434"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dh'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dhm'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dhms'</span> <span class="kr">then</span> </span><span id="L-1435"><a href="#L-1435"><span class="linenos" data-line="1435"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dh'</span> <span class="kr">then</span> </span><span id="L-1436"><a href="#L-1436"><span class="linenos" data-line="1436"></span></a> <span class="kr">return</span> <span class="n">days</span><span class="p">,</span> <span class="n">H</span> </span><span id="L-1437"><a href="#L-1437"><span class="linenos" data-line="1437"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'dhm'</span> <span class="kr">then</span> </span><span id="L-1438"><a href="#L-1438"><span class="linenos" data-line="1438"></span></a> <span class="kr">return</span> <span class="n">days</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span> </span><span id="L-1439"><a href="#L-1439"><span class="linenos" data-line="1439"></span></a> <span class="kr">else</span> </span><span id="L-1440"><a href="#L-1440"><span class="linenos" data-line="1440"></span></a> <span class="kr">return</span> <span class="n">days</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> </span><span id="L-1441"><a href="#L-1441"><span class="linenos" data-line="1441"></span></a> <span class="kr">end</span> </span><span id="L-1442"><a href="#L-1442"><span class="linenos" data-line="1442"></span></a> <span class="kr">end</span> </span><span id="L-1443"><a href="#L-1443"><span class="linenos" data-line="1443"></span></a> <span class="kd">local</span> <span class="n">hours</span> <span class="o">=</span> <span class="n">days</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">+</span> <span class="n">H</span> </span><span id="L-1444"><a href="#L-1444"><span class="linenos" data-line="1444"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'h'</span> <span class="kr">then</span> </span><span id="L-1445"><a href="#L-1445"><span class="linenos" data-line="1445"></span></a> <span class="kr">return</span> <span class="n">hours</span> </span><span id="L-1446"><a href="#L-1446"><span class="linenos" data-line="1446"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'hm'</span> <span class="kr">then</span> </span><span id="L-1447"><a href="#L-1447"><span class="linenos" data-line="1447"></span></a> <span class="kr">return</span> <span class="n">hours</span><span class="p">,</span> <span class="n">M</span> </span><span id="L-1448"><a href="#L-1448"><span class="linenos" data-line="1448"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'M'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'s'</span> <span class="kr">then</span> </span><span id="L-1449"><a href="#L-1449"><span class="linenos" data-line="1449"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="n">hours</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">+</span> <span class="n">M</span> </span><span id="L-1450"><a href="#L-1450"><span class="linenos" data-line="1450"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'M'</span> <span class="kr">then</span> </span><span id="L-1451"><a href="#L-1451"><span class="linenos" data-line="1451"></span></a> <span class="kr">return</span> <span class="n">M</span> </span><span id="L-1452"><a href="#L-1452"><span class="linenos" data-line="1452"></span></a> <span class="kr">end</span> </span><span id="L-1453"><a href="#L-1453"><span class="linenos" data-line="1453"></span></a> <span class="kr">return</span> <span class="n">M</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">+</span> <span class="n">S</span> </span><span id="L-1454"><a href="#L-1454"><span class="linenos" data-line="1454"></span></a> <span class="kr">end</span> </span><span id="L-1455"><a href="#L-1455"><span class="linenos" data-line="1455"></span></a> <span class="kr">return</span> <span class="n">hours</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> </span><span id="L-1456"><a href="#L-1456"><span class="linenos" data-line="1456"></span></a> <span class="kr">end</span> </span><span id="L-1457"><a href="#L-1457"><span class="linenos" data-line="1457"></span></a> <span class="kr">if</span> <span class="n">wantround</span> <span class="kr">then</span> </span><span id="L-1458"><a href="#L-1458"><span class="linenos" data-line="1458"></span></a> <span class="kd">local</span> <span class="n">inc_hour</span> </span><span id="L-1459"><a href="#L-1459"><span class="linenos" data-line="1459"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymdh'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymwdh'</span> <span class="kr">then</span> </span><span id="L-1460"><a href="#L-1460"><span class="linenos" data-line="1460"></span></a> <span class="kr">if</span> <span class="n">M</span> <span class="o">>=</span> <span class="mi">30</span> <span class="kr">then</span> </span><span id="L-1461"><a href="#L-1461"><span class="linenos" data-line="1461"></span></a> <span class="n">inc_hour</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1462"><a href="#L-1462"><span class="linenos" data-line="1462"></span></a> <span class="kr">end</span> </span><span id="L-1463"><a href="#L-1463"><span class="linenos" data-line="1463"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymdhm'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymwdhm'</span> <span class="kr">then</span> </span><span id="L-1464"><a href="#L-1464"><span class="linenos" data-line="1464"></span></a> <span class="kr">if</span> <span class="n">S</span> <span class="o">>=</span> <span class="mi">30</span> <span class="kr">then</span> </span><span id="L-1465"><a href="#L-1465"><span class="linenos" data-line="1465"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1466"><a href="#L-1466"><span class="linenos" data-line="1466"></span></a> <span class="kr">if</span> <span class="n">M</span> <span class="o">>=</span> <span class="mi">60</span> <span class="kr">then</span> </span><span id="L-1467"><a href="#L-1467"><span class="linenos" data-line="1467"></span></a> <span class="n">M</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1468"><a href="#L-1468"><span class="linenos" data-line="1468"></span></a> <span class="n">inc_hour</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1469"><a href="#L-1469"><span class="linenos" data-line="1469"></span></a> <span class="kr">end</span> </span><span id="L-1470"><a href="#L-1470"><span class="linenos" data-line="1470"></span></a> <span class="kr">end</span> </span><span id="L-1471"><a href="#L-1471"><span class="linenos" data-line="1471"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymd'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymwd'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'yd'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'md'</span> <span class="kr">then</span> </span><span id="L-1472"><a href="#L-1472"><span class="linenos" data-line="1472"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="o">>=</span> <span class="mi">12</span> <span class="kr">then</span> </span><span id="L-1473"><a href="#L-1473"><span class="linenos" data-line="1473"></span></a> <span class="n">extra_days</span> <span class="o">=</span> <span class="n">extra_days</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1474"><a href="#L-1474"><span class="linenos" data-line="1474"></span></a> <span class="kr">end</span> </span><span id="L-1475"><a href="#L-1475"><span class="linenos" data-line="1475"></span></a> <span class="kr">end</span> </span><span id="L-1476"><a href="#L-1476"><span class="linenos" data-line="1476"></span></a> <span class="kr">if</span> <span class="n">inc_hour</span> <span class="kr">then</span> </span><span id="L-1477"><a href="#L-1477"><span class="linenos" data-line="1477"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="n">H</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1478"><a href="#L-1478"><span class="linenos" data-line="1478"></span></a> <span class="kr">if</span> <span class="n">H</span> <span class="o">>=</span> <span class="mi">24</span> <span class="kr">then</span> </span><span id="L-1479"><a href="#L-1479"><span class="linenos" data-line="1479"></span></a> <span class="n">H</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1480"><a href="#L-1480"><span class="linenos" data-line="1480"></span></a> <span class="n">extra_days</span> <span class="o">=</span> <span class="n">extra_days</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1481"><a href="#L-1481"><span class="linenos" data-line="1481"></span></a> <span class="kr">end</span> </span><span id="L-1482"><a href="#L-1482"><span class="linenos" data-line="1482"></span></a> <span class="kr">end</span> </span><span id="L-1483"><a href="#L-1483"><span class="linenos" data-line="1483"></span></a> <span class="kr">end</span> </span><span id="L-1484"><a href="#L-1484"><span class="linenos" data-line="1484"></span></a> <span class="kd">local</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">years</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">months</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">days</span> </span><span id="L-1485"><a href="#L-1485"><span class="linenos" data-line="1485"></span></a> <span class="kr">if</span> <span class="n">extra_days</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1486"><a href="#L-1486"><span class="linenos" data-line="1486"></span></a> <span class="n">d</span> <span class="o">=</span> <span class="n">d</span> <span class="o">+</span> <span class="n">extra_days</span> </span><span id="L-1487"><a href="#L-1487"><span class="linenos" data-line="1487"></span></a> <span class="kr">if</span> <span class="n">d</span> <span class="o">></span> <span class="mi">28</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'yd'</span> <span class="kr">then</span> </span><span id="L-1488"><a href="#L-1488"><span class="linenos" data-line="1488"></span></a> <span class="c1">-- Recalculate in case have passed a month.</span> </span><span id="L-1489"><a href="#L-1489"><span class="linenos" data-line="1489"></span></a> <span class="n">diff</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">date1</span> <span class="o">+</span> <span class="n">extra_days</span> <span class="o">-</span> <span class="n">diff</span><span class="p">.</span><span class="n">date2</span> </span><span id="L-1490"><a href="#L-1490"><span class="linenos" data-line="1490"></span></a> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">years</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">months</span><span class="p">,</span> <span class="n">diff</span><span class="p">.</span><span class="n">days</span> </span><span id="L-1491"><a href="#L-1491"><span class="linenos" data-line="1491"></span></a> <span class="kr">end</span> </span><span id="L-1492"><a href="#L-1492"><span class="linenos" data-line="1492"></span></a> <span class="kr">end</span> </span><span id="L-1493"><a href="#L-1493"><span class="linenos" data-line="1493"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymd'</span> <span class="kr">then</span> </span><span id="L-1494"><a href="#L-1494"><span class="linenos" data-line="1494"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> </span><span id="L-1495"><a href="#L-1495"><span class="linenos" data-line="1495"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'yd'</span> <span class="kr">then</span> </span><span id="L-1496"><a href="#L-1496"><span class="linenos" data-line="1496"></span></a> <span class="kr">if</span> <span class="n">y</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1497"><a href="#L-1497"><span class="linenos" data-line="1497"></span></a> <span class="c1">-- It is known that diff.date1 > diff.date2.</span> </span><span id="L-1498"><a href="#L-1498"><span class="linenos" data-line="1498"></span></a> <span class="n">diff</span> <span class="o">=</span> <span class="n">diff</span><span class="p">.</span><span class="n">date1</span> <span class="o">-</span> <span class="p">(</span><span class="n">diff</span><span class="p">.</span><span class="n">date2</span> <span class="o">+</span> <span class="p">(</span><span class="n">y</span> <span class="o">..</span> <span class="s1">'y'</span><span class="p">))</span> </span><span id="L-1499"><a href="#L-1499"><span class="linenos" data-line="1499"></span></a> <span class="kr">end</span> </span><span id="L-1500"><a href="#L-1500"><span class="linenos" data-line="1500"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">floor</span><span class="p">(</span><span class="n">diff</span><span class="p">.</span><span class="n">age_days</span><span class="p">)</span> </span><span id="L-1501"><a href="#L-1501"><span class="linenos" data-line="1501"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'md'</span> <span class="kr">then</span> </span><span id="L-1502"><a href="#L-1502"><span class="linenos" data-line="1502"></span></a> <span class="kr">return</span> <span class="n">y</span> <span class="o">*</span> <span class="mi">12</span> <span class="o">+</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span> </span><span id="L-1503"><a href="#L-1503"><span class="linenos" data-line="1503"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ym'</span> <span class="ow">or</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'m'</span> <span class="kr">then</span> </span><span id="L-1504"><a href="#L-1504"><span class="linenos" data-line="1504"></span></a> <span class="kr">if</span> <span class="n">wantround</span> <span class="kr">then</span> </span><span id="L-1505"><a href="#L-1505"><span class="linenos" data-line="1505"></span></a> <span class="kr">if</span> <span class="n">d</span> <span class="o">>=</span> <span class="mi">16</span> <span class="kr">then</span> </span><span id="L-1506"><a href="#L-1506"><span class="linenos" data-line="1506"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1507"><a href="#L-1507"><span class="linenos" data-line="1507"></span></a> <span class="kr">if</span> <span class="n">m</span> <span class="o">>=</span> <span class="mi">12</span> <span class="kr">then</span> </span><span id="L-1508"><a href="#L-1508"><span class="linenos" data-line="1508"></span></a> <span class="n">m</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1509"><a href="#L-1509"><span class="linenos" data-line="1509"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1510"><a href="#L-1510"><span class="linenos" data-line="1510"></span></a> <span class="kr">end</span> </span><span id="L-1511"><a href="#L-1511"><span class="linenos" data-line="1511"></span></a> <span class="kr">end</span> </span><span id="L-1512"><a href="#L-1512"><span class="linenos" data-line="1512"></span></a> <span class="kr">end</span> </span><span id="L-1513"><a href="#L-1513"><span class="linenos" data-line="1513"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ym'</span> <span class="kr">then</span> </span><span id="L-1514"><a href="#L-1514"><span class="linenos" data-line="1514"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span> </span><span id="L-1515"><a href="#L-1515"><span class="linenos" data-line="1515"></span></a> <span class="kr">end</span> </span><span id="L-1516"><a href="#L-1516"><span class="linenos" data-line="1516"></span></a> <span class="kr">return</span> <span class="n">y</span> <span class="o">*</span> <span class="mi">12</span> <span class="o">+</span> <span class="n">m</span> </span><span id="L-1517"><a href="#L-1517"><span class="linenos" data-line="1517"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymw'</span> <span class="kr">then</span> </span><span id="L-1518"><a href="#L-1518"><span class="linenos" data-line="1518"></span></a> <span class="kd">local</span> <span class="n">weeks</span> <span class="o">=</span> <span class="n">floor</span><span class="p">(</span><span class="n">d</span><span class="o">/</span><span class="mi">7</span><span class="p">)</span> </span><span id="L-1519"><a href="#L-1519"><span class="linenos" data-line="1519"></span></a> <span class="kr">if</span> <span class="n">wantround</span> <span class="kr">then</span> </span><span id="L-1520"><a href="#L-1520"><span class="linenos" data-line="1520"></span></a> <span class="kd">local</span> <span class="n">days</span> <span class="o">=</span> <span class="n">d</span> <span class="o">%</span> <span class="mi">7</span> </span><span id="L-1521"><a href="#L-1521"><span class="linenos" data-line="1521"></span></a> <span class="kr">if</span> <span class="n">days</span> <span class="o">></span> <span class="mi">3</span> <span class="ow">or</span> <span class="p">(</span><span class="n">days</span> <span class="o">==</span> <span class="mi">3</span> <span class="ow">and</span> <span class="n">H</span> <span class="o">>=</span> <span class="mi">12</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1522"><a href="#L-1522"><span class="linenos" data-line="1522"></span></a> <span class="n">weeks</span> <span class="o">=</span> <span class="n">weeks</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1523"><a href="#L-1523"><span class="linenos" data-line="1523"></span></a> <span class="kr">end</span> </span><span id="L-1524"><a href="#L-1524"><span class="linenos" data-line="1524"></span></a> <span class="kr">end</span> </span><span id="L-1525"><a href="#L-1525"><span class="linenos" data-line="1525"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">weeks</span> </span><span id="L-1526"><a href="#L-1526"><span class="linenos" data-line="1526"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymwd'</span> <span class="kr">then</span> </span><span id="L-1527"><a href="#L-1527"><span class="linenos" data-line="1527"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">floor</span><span class="p">(</span><span class="n">d</span><span class="o">/</span><span class="mi">7</span><span class="p">),</span> <span class="n">d</span> <span class="o">%</span> <span class="mi">7</span> </span><span id="L-1528"><a href="#L-1528"><span class="linenos" data-line="1528"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymdh'</span> <span class="kr">then</span> </span><span id="L-1529"><a href="#L-1529"><span class="linenos" data-line="1529"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">H</span> </span><span id="L-1530"><a href="#L-1530"><span class="linenos" data-line="1530"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymwdh'</span> <span class="kr">then</span> </span><span id="L-1531"><a href="#L-1531"><span class="linenos" data-line="1531"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">floor</span><span class="p">(</span><span class="n">d</span><span class="o">/</span><span class="mi">7</span><span class="p">),</span> <span class="n">d</span> <span class="o">%</span> <span class="mi">7</span><span class="p">,</span> <span class="n">H</span> </span><span id="L-1532"><a href="#L-1532"><span class="linenos" data-line="1532"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymdhm'</span> <span class="kr">then</span> </span><span id="L-1533"><a href="#L-1533"><span class="linenos" data-line="1533"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span> </span><span id="L-1534"><a href="#L-1534"><span class="linenos" data-line="1534"></span></a> <span class="kr">elseif</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'ymwdhm'</span> <span class="kr">then</span> </span><span id="L-1535"><a href="#L-1535"><span class="linenos" data-line="1535"></span></a> <span class="kr">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">floor</span><span class="p">(</span><span class="n">d</span><span class="o">/</span><span class="mi">7</span><span class="p">),</span> <span class="n">d</span> <span class="o">%</span> <span class="mi">7</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span> </span><span id="L-1536"><a href="#L-1536"><span class="linenos" data-line="1536"></span></a> <span class="kr">end</span> </span><span id="L-1537"><a href="#L-1537"><span class="linenos" data-line="1537"></span></a> <span class="kr">if</span> <span class="n">code</span> <span class="o">==</span> <span class="s1">'y'</span> <span class="kr">then</span> </span><span id="L-1538"><a href="#L-1538"><span class="linenos" data-line="1538"></span></a> <span class="kr">if</span> <span class="n">wantround</span> <span class="ow">and</span> <span class="n">m</span> <span class="o">>=</span> <span class="mi">6</span> <span class="kr">then</span> </span><span id="L-1539"><a href="#L-1539"><span class="linenos" data-line="1539"></span></a> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1540"><a href="#L-1540"><span class="linenos" data-line="1540"></span></a> <span class="kr">end</span> </span><span id="L-1541"><a href="#L-1541"><span class="linenos" data-line="1541"></span></a> <span class="kr">return</span> <span class="n">y</span> </span><span id="L-1542"><a href="#L-1542"><span class="linenos" data-line="1542"></span></a> <span class="kr">end</span> </span><span id="L-1543"><a href="#L-1543"><span class="linenos" data-line="1543"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-1544"><a href="#L-1544"><span class="linenos" data-line="1544"></span></a><span class="kr">end</span> </span><span id="L-1545"><a href="#L-1545"><span class="linenos" data-line="1545"></span></a> </span><span id="L-1546"><a href="#L-1546"><span class="linenos" data-line="1546"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">_diff_duration</span><span class="p">(</span><span class="n">diff</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-1547"><a href="#L-1547"><span class="linenos" data-line="1547"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> <span class="o">~=</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-1548"><a href="#L-1548"><span class="linenos" data-line="1548"></span></a> <span class="n">options</span> <span class="o">=</span> <span class="p">{</span> <span class="n">round</span> <span class="o">=</span> <span class="n">options</span> <span class="p">}</span> </span><span id="L-1549"><a href="#L-1549"><span class="linenos" data-line="1549"></span></a> <span class="kr">end</span> </span><span id="L-1550"><a href="#L-1550"><span class="linenos" data-line="1550"></span></a> <span class="n">options</span><span class="p">.</span><span class="n">duration</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1551"><a href="#L-1551"><span class="linenos" data-line="1551"></span></a> <span class="kr">return</span> <span class="n">_diff_age</span><span class="p">(</span><span class="n">diff</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> </span><span id="L-1552"><a href="#L-1552"><span class="linenos" data-line="1552"></span></a><span class="kr">end</span> </span><span id="L-1553"><a href="#L-1553"><span class="linenos" data-line="1553"></span></a> </span><span id="L-1554"><a href="#L-1554"><span class="linenos" data-line="1554"></span></a><span class="c1">-- Metatable for some operations on date differences.</span> </span><span id="L-1555"><a href="#L-1555"><span class="linenos" data-line="1555"></span></a><span class="n">diffmt</span> <span class="o">=</span> <span class="p">{</span> <span class="c1">-- for forward declaration above</span> </span><span id="L-1556"><a href="#L-1556"><span class="linenos" data-line="1556"></span></a> <span class="n">__concat</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span> </span><span id="L-1557"><a href="#L-1557"><span class="linenos" data-line="1557"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">lhs</span><span class="p">)</span> <span class="o">..</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">rhs</span><span class="p">)</span> </span><span id="L-1558"><a href="#L-1558"><span class="linenos" data-line="1558"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1559"><a href="#L-1559"><span class="linenos" data-line="1559"></span></a> <span class="n">__tostring</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1560"><a href="#L-1560"><span class="linenos" data-line="1560"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">age_days</span><span class="p">)</span> </span><span id="L-1561"><a href="#L-1561"><span class="linenos" data-line="1561"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1562"><a href="#L-1562"><span class="linenos" data-line="1562"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="kr">function</span> <span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> </span><span id="L-1563"><a href="#L-1563"><span class="linenos" data-line="1563"></span></a> <span class="kd">local</span> <span class="n">value</span> </span><span id="L-1564"><a href="#L-1564"><span class="linenos" data-line="1564"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'age_days'</span> <span class="kr">then</span> </span><span id="L-1565"><a href="#L-1565"><span class="linenos" data-line="1565"></span></a> <span class="kr">if</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s1">'partial'</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1566"><a href="#L-1566"><span class="linenos" data-line="1566"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">jdz</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> </span><span id="L-1567"><a href="#L-1567"><span class="linenos" data-line="1567"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="ow">and</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span><span class="p">.</span><span class="n">first</span> <span class="ow">or</span> <span class="n">date</span><span class="p">).</span><span class="n">jdz</span> </span><span id="L-1568"><a href="#L-1568"><span class="linenos" data-line="1568"></span></a> <span class="kr">end</span> </span><span id="L-1569"><a href="#L-1569"><span class="linenos" data-line="1569"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">jdz</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">date1</span><span class="p">)</span> <span class="o">-</span> <span class="n">jdz</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">date2</span><span class="p">)</span> </span><span id="L-1570"><a href="#L-1570"><span class="linenos" data-line="1570"></span></a> <span class="kr">else</span> </span><span id="L-1571"><a href="#L-1571"><span class="linenos" data-line="1571"></span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">date1</span><span class="p">.</span><span class="n">jdz</span> <span class="o">-</span> <span class="n">self</span><span class="p">.</span><span class="n">date2</span><span class="p">.</span><span class="n">jdz</span> </span><span id="L-1572"><a href="#L-1572"><span class="linenos" data-line="1572"></span></a> <span class="kr">end</span> </span><span id="L-1573"><a href="#L-1573"><span class="linenos" data-line="1573"></span></a> <span class="kr">end</span> </span><span id="L-1574"><a href="#L-1574"><span class="linenos" data-line="1574"></span></a> <span class="kr">if</span> <span class="n">value</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1575"><a href="#L-1575"><span class="linenos" data-line="1575"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> </span><span id="L-1576"><a href="#L-1576"><span class="linenos" data-line="1576"></span></a> <span class="kr">return</span> <span class="n">value</span> </span><span id="L-1577"><a href="#L-1577"><span class="linenos" data-line="1577"></span></a> <span class="kr">end</span> </span><span id="L-1578"><a href="#L-1578"><span class="linenos" data-line="1578"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1579"><a href="#L-1579"><span class="linenos" data-line="1579"></span></a><span class="p">}</span> </span><span id="L-1580"><a href="#L-1580"><span class="linenos" data-line="1580"></span></a> </span><span id="L-1581"><a href="#L-1581"><span class="linenos" data-line="1581"></span></a><span class="kr">function</span> <span class="nf">DateDiff</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="n">date2</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> <span class="c1">-- for forward declaration above</span> </span><span id="L-1582"><a href="#L-1582"><span class="linenos" data-line="1582"></span></a> <span class="c1">-- Return a table with the difference between two dates (date1 - date2).</span> </span><span id="L-1583"><a href="#L-1583"><span class="linenos" data-line="1583"></span></a> <span class="c1">-- The difference is negative if date1 is older than date2.</span> </span><span id="L-1584"><a href="#L-1584"><span class="linenos" data-line="1584"></span></a> <span class="c1">-- Return nothing if invalid.</span> </span><span id="L-1585"><a href="#L-1585"><span class="linenos" data-line="1585"></span></a> <span class="c1">-- If d = date1 - date2 then</span> </span><span id="L-1586"><a href="#L-1586"><span class="linenos" data-line="1586"></span></a> <span class="c1">-- date1 = date2 + d</span> </span><span id="L-1587"><a href="#L-1587"><span class="linenos" data-line="1587"></span></a> <span class="c1">-- If date1 >= date2 and the dates have no H:M:S time specified then</span> </span><span id="L-1588"><a href="#L-1588"><span class="linenos" data-line="1588"></span></a> <span class="c1">-- date1 = date2 + (d.years..'y') + (d.months..'m') + d.days</span> </span><span id="L-1589"><a href="#L-1589"><span class="linenos" data-line="1589"></span></a> <span class="c1">-- where the larger time units are added first.</span> </span><span id="L-1590"><a href="#L-1590"><span class="linenos" data-line="1590"></span></a> <span class="c1">-- The result of Date(2015,1,x) + '1m' is Date(2015,2,28) for</span> </span><span id="L-1591"><a href="#L-1591"><span class="linenos" data-line="1591"></span></a> <span class="c1">-- x = 28, 29, 30, 31. That means, for example,</span> </span><span id="L-1592"><a href="#L-1592"><span class="linenos" data-line="1592"></span></a> <span class="c1">-- d = Date(2015,3,3) - Date(2015,1,31)</span> </span><span id="L-1593"><a href="#L-1593"><span class="linenos" data-line="1593"></span></a> <span class="c1">-- gives d.years, d.months, d.days = 0, 1, 3 (excluding date1).</span> </span><span id="L-1594"><a href="#L-1594"><span class="linenos" data-line="1594"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_date</span><span class="p">(</span><span class="n">date1</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_date</span><span class="p">(</span><span class="n">date2</span><span class="p">)</span> <span class="ow">and</span> <span class="n">date1</span><span class="p">.</span><span class="n">calendar</span> <span class="o">==</span> <span class="n">date2</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1595"><a href="#L-1595"><span class="linenos" data-line="1595"></span></a> <span class="kr">return</span> </span><span id="L-1596"><a href="#L-1596"><span class="linenos" data-line="1596"></span></a> <span class="kr">end</span> </span><span id="L-1597"><a href="#L-1597"><span class="linenos" data-line="1597"></span></a> <span class="kd">local</span> <span class="n">wantfill</span> </span><span id="L-1598"><a href="#L-1598"><span class="linenos" data-line="1598"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'table'</span> <span class="kr">then</span> </span><span id="L-1599"><a href="#L-1599"><span class="linenos" data-line="1599"></span></a> <span class="n">wantfill</span> <span class="o">=</span> <span class="n">options</span><span class="p">.</span><span class="n">fill</span> </span><span id="L-1600"><a href="#L-1600"><span class="linenos" data-line="1600"></span></a> <span class="kr">end</span> </span><span id="L-1601"><a href="#L-1601"><span class="linenos" data-line="1601"></span></a> <span class="kd">local</span> <span class="n">isnegative</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-1602"><a href="#L-1602"><span class="linenos" data-line="1602"></span></a> <span class="kd">local</span> <span class="n">iszero</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-1603"><a href="#L-1603"><span class="linenos" data-line="1603"></span></a> <span class="kr">if</span> <span class="n">date1</span> <span class="o"><</span> <span class="n">date2</span> <span class="kr">then</span> </span><span id="L-1604"><a href="#L-1604"><span class="linenos" data-line="1604"></span></a> <span class="n">isnegative</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1605"><a href="#L-1605"><span class="linenos" data-line="1605"></span></a> <span class="n">date1</span><span class="p">,</span> <span class="n">date2</span> <span class="o">=</span> <span class="n">date2</span><span class="p">,</span> <span class="n">date1</span> </span><span id="L-1606"><a href="#L-1606"><span class="linenos" data-line="1606"></span></a> <span class="kr">elseif</span> <span class="n">date1</span> <span class="o">==</span> <span class="n">date2</span> <span class="kr">then</span> </span><span id="L-1607"><a href="#L-1607"><span class="linenos" data-line="1607"></span></a> <span class="n">iszero</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1608"><a href="#L-1608"><span class="linenos" data-line="1608"></span></a> <span class="kr">end</span> </span><span id="L-1609"><a href="#L-1609"><span class="linenos" data-line="1609"></span></a> <span class="c1">-- It is known that date1 >= date2 (period is from date2 to date1).</span> </span><span id="L-1610"><a href="#L-1610"><span class="linenos" data-line="1610"></span></a> <span class="kr">if</span> <span class="n">date1</span><span class="p">.</span><span class="n">partial</span> <span class="ow">or</span> <span class="n">date2</span><span class="p">.</span><span class="n">partial</span> <span class="kr">then</span> </span><span id="L-1611"><a href="#L-1611"><span class="linenos" data-line="1611"></span></a> <span class="c1">-- Two partial dates might have timelines:</span> </span><span id="L-1612"><a href="#L-1612"><span class="linenos" data-line="1612"></span></a> <span class="c1">---------------------A=================B--- date1 is from A to B inclusive</span> </span><span id="L-1613"><a href="#L-1613"><span class="linenos" data-line="1613"></span></a> <span class="c1">--------C=======D-------------------------- date2 is from C to D inclusive</span> </span><span id="L-1614"><a href="#L-1614"><span class="linenos" data-line="1614"></span></a> <span class="c1">-- date1 > date2 iff A > C (date1.partial.first > date2.partial.first)</span> </span><span id="L-1615"><a href="#L-1615"><span class="linenos" data-line="1615"></span></a> <span class="c1">-- The periods can overlap ('April 2001' - '2001'):</span> </span><span id="L-1616"><a href="#L-1616"><span class="linenos" data-line="1616"></span></a> <span class="c1">-------------A===B------------------------- A=2001-04-01 B=2001-04-30</span> </span><span id="L-1617"><a href="#L-1617"><span class="linenos" data-line="1617"></span></a> <span class="c1">--------C=====================D------------ C=2001-01-01 D=2001-12-31</span> </span><span id="L-1618"><a href="#L-1618"><span class="linenos" data-line="1618"></span></a> <span class="kr">if</span> <span class="n">wantfill</span> <span class="kr">then</span> </span><span id="L-1619"><a href="#L-1619"><span class="linenos" data-line="1619"></span></a> <span class="n">date1</span><span class="p">,</span> <span class="n">date2</span> <span class="o">=</span> <span class="n">autofill</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="n">date2</span><span class="p">)</span> </span><span id="L-1620"><a href="#L-1620"><span class="linenos" data-line="1620"></span></a> <span class="kr">else</span> </span><span id="L-1621"><a href="#L-1621"><span class="linenos" data-line="1621"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">zdiff</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="n">date2</span><span class="p">)</span> </span><span id="L-1622"><a href="#L-1622"><span class="linenos" data-line="1622"></span></a> <span class="kd">local</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">date2</span> </span><span id="L-1623"><a href="#L-1623"><span class="linenos" data-line="1623"></span></a> <span class="kr">if</span> <span class="n">diff</span><span class="p">.</span><span class="n">isnegative</span> <span class="kr">then</span> </span><span id="L-1624"><a href="#L-1624"><span class="linenos" data-line="1624"></span></a> <span class="kr">return</span> <span class="n">date1</span> <span class="o">-</span> <span class="n">date1</span> <span class="c1">-- a valid diff in case we call its methods</span> </span><span id="L-1625"><a href="#L-1625"><span class="linenos" data-line="1625"></span></a> <span class="kr">end</span> </span><span id="L-1626"><a href="#L-1626"><span class="linenos" data-line="1626"></span></a> <span class="kr">return</span> <span class="n">diff</span> </span><span id="L-1627"><a href="#L-1627"><span class="linenos" data-line="1627"></span></a> <span class="kr">end</span> </span><span id="L-1628"><a href="#L-1628"><span class="linenos" data-line="1628"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">getdate</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">which</span><span class="p">)</span> </span><span id="L-1629"><a href="#L-1629"><span class="linenos" data-line="1629"></span></a> <span class="kr">return</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span> <span class="ow">and</span> <span class="n">date</span><span class="p">.</span><span class="n">partial</span><span class="p">[</span><span class="n">which</span><span class="p">]</span> <span class="ow">or</span> <span class="n">date</span> </span><span id="L-1630"><a href="#L-1630"><span class="linenos" data-line="1630"></span></a> <span class="kr">end</span> </span><span id="L-1631"><a href="#L-1631"><span class="linenos" data-line="1631"></span></a> <span class="kd">local</span> <span class="n">maxdiff</span> <span class="o">=</span> <span class="n">zdiff</span><span class="p">(</span><span class="n">getdate</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="s1">'last'</span><span class="p">),</span> <span class="n">getdate</span><span class="p">(</span><span class="n">date2</span><span class="p">,</span> <span class="s1">'first'</span><span class="p">))</span> </span><span id="L-1632"><a href="#L-1632"><span class="linenos" data-line="1632"></span></a> <span class="kd">local</span> <span class="n">mindiff</span> <span class="o">=</span> <span class="n">zdiff</span><span class="p">(</span><span class="n">getdate</span><span class="p">(</span><span class="n">date1</span><span class="p">,</span> <span class="s1">'first'</span><span class="p">),</span> <span class="n">getdate</span><span class="p">(</span><span class="n">date2</span><span class="p">,</span> <span class="s1">'last'</span><span class="p">))</span> </span><span id="L-1633"><a href="#L-1633"><span class="linenos" data-line="1633"></span></a> <span class="kd">local</span> <span class="n">years</span><span class="p">,</span> <span class="n">months</span> </span><span id="L-1634"><a href="#L-1634"><span class="linenos" data-line="1634"></span></a> <span class="kr">if</span> <span class="n">maxdiff</span><span class="p">.</span><span class="n">years</span> <span class="o">==</span> <span class="n">mindiff</span><span class="p">.</span><span class="n">years</span> <span class="kr">then</span> </span><span id="L-1635"><a href="#L-1635"><span class="linenos" data-line="1635"></span></a> <span class="n">years</span> <span class="o">=</span> <span class="n">maxdiff</span><span class="p">.</span><span class="n">years</span> </span><span id="L-1636"><a href="#L-1636"><span class="linenos" data-line="1636"></span></a> <span class="kr">if</span> <span class="n">maxdiff</span><span class="p">.</span><span class="n">months</span> <span class="o">==</span> <span class="n">mindiff</span><span class="p">.</span><span class="n">months</span> <span class="kr">then</span> </span><span id="L-1637"><a href="#L-1637"><span class="linenos" data-line="1637"></span></a> <span class="n">months</span> <span class="o">=</span> <span class="n">maxdiff</span><span class="p">.</span><span class="n">months</span> </span><span id="L-1638"><a href="#L-1638"><span class="linenos" data-line="1638"></span></a> <span class="kr">else</span> </span><span id="L-1639"><a href="#L-1639"><span class="linenos" data-line="1639"></span></a> <span class="n">months</span> <span class="o">=</span> <span class="p">{</span> <span class="n">mindiff</span><span class="p">.</span><span class="n">months</span><span class="p">,</span> <span class="n">maxdiff</span><span class="p">.</span><span class="n">months</span> <span class="p">}</span> </span><span id="L-1640"><a href="#L-1640"><span class="linenos" data-line="1640"></span></a> <span class="kr">end</span> </span><span id="L-1641"><a href="#L-1641"><span class="linenos" data-line="1641"></span></a> <span class="kr">else</span> </span><span id="L-1642"><a href="#L-1642"><span class="linenos" data-line="1642"></span></a> <span class="n">years</span> <span class="o">=</span> <span class="p">{</span> <span class="n">mindiff</span><span class="p">.</span><span class="n">years</span><span class="p">,</span> <span class="n">maxdiff</span><span class="p">.</span><span class="n">years</span> <span class="p">}</span> </span><span id="L-1643"><a href="#L-1643"><span class="linenos" data-line="1643"></span></a> <span class="kr">end</span> </span><span id="L-1644"><a href="#L-1644"><span class="linenos" data-line="1644"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-1645"><a href="#L-1645"><span class="linenos" data-line="1645"></span></a> <span class="n">date1</span> <span class="o">=</span> <span class="n">date1</span><span class="p">,</span> </span><span id="L-1646"><a href="#L-1646"><span class="linenos" data-line="1646"></span></a> <span class="n">date2</span> <span class="o">=</span> <span class="n">date2</span><span class="p">,</span> </span><span id="L-1647"><a href="#L-1647"><span class="linenos" data-line="1647"></span></a> <span class="n">partial</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-1648"><a href="#L-1648"><span class="linenos" data-line="1648"></span></a> <span class="n">years</span> <span class="o">=</span> <span class="n">years</span><span class="p">,</span> </span><span id="L-1649"><a href="#L-1649"><span class="linenos" data-line="1649"></span></a> <span class="n">months</span> <span class="o">=</span> <span class="n">months</span><span class="p">,</span> </span><span id="L-1650"><a href="#L-1650"><span class="linenos" data-line="1650"></span></a> <span class="n">maxdiff</span> <span class="o">=</span> <span class="n">maxdiff</span><span class="p">,</span> </span><span id="L-1651"><a href="#L-1651"><span class="linenos" data-line="1651"></span></a> <span class="n">mindiff</span> <span class="o">=</span> <span class="n">mindiff</span><span class="p">,</span> </span><span id="L-1652"><a href="#L-1652"><span class="linenos" data-line="1652"></span></a> <span class="p">},</span> </span><span id="L-1653"><a href="#L-1653"><span class="linenos" data-line="1653"></span></a> <span class="n">isnegative</span> <span class="o">=</span> <span class="n">isnegative</span><span class="p">,</span> </span><span id="L-1654"><a href="#L-1654"><span class="linenos" data-line="1654"></span></a> <span class="n">iszero</span> <span class="o">=</span> <span class="n">iszero</span><span class="p">,</span> </span><span id="L-1655"><a href="#L-1655"><span class="linenos" data-line="1655"></span></a> <span class="n">age</span> <span class="o">=</span> <span class="n">_diff_age</span><span class="p">,</span> </span><span id="L-1656"><a href="#L-1656"><span class="linenos" data-line="1656"></span></a> <span class="n">duration</span> <span class="o">=</span> <span class="n">_diff_duration</span><span class="p">,</span> </span><span id="L-1657"><a href="#L-1657"><span class="linenos" data-line="1657"></span></a> <span class="p">},</span> <span class="n">diffmt</span><span class="p">)</span> </span><span id="L-1658"><a href="#L-1658"><span class="linenos" data-line="1658"></span></a> <span class="kr">end</span> </span><span id="L-1659"><a href="#L-1659"><span class="linenos" data-line="1659"></span></a> <span class="kr">end</span> </span><span id="L-1660"><a href="#L-1660"><span class="linenos" data-line="1660"></span></a> <span class="kd">local</span> <span class="n">y1</span><span class="p">,</span> <span class="n">m1</span> <span class="o">=</span> <span class="n">date1</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">date1</span><span class="p">.</span><span class="n">month</span> </span><span id="L-1661"><a href="#L-1661"><span class="linenos" data-line="1661"></span></a> <span class="kd">local</span> <span class="n">y2</span><span class="p">,</span> <span class="n">m2</span> <span class="o">=</span> <span class="n">date2</span><span class="p">.</span><span class="n">year</span><span class="p">,</span> <span class="n">date2</span><span class="p">.</span><span class="n">month</span> </span><span id="L-1662"><a href="#L-1662"><span class="linenos" data-line="1662"></span></a> <span class="kd">local</span> <span class="n">years</span> <span class="o">=</span> <span class="n">y1</span> <span class="o">-</span> <span class="n">y2</span> </span><span id="L-1663"><a href="#L-1663"><span class="linenos" data-line="1663"></span></a> <span class="kd">local</span> <span class="n">months</span> <span class="o">=</span> <span class="n">m1</span> <span class="o">-</span> <span class="n">m2</span> </span><span id="L-1664"><a href="#L-1664"><span class="linenos" data-line="1664"></span></a> <span class="kd">local</span> <span class="n">d1</span> <span class="o">=</span> <span class="n">date1</span><span class="p">.</span><span class="n">day</span> <span class="o">+</span> <span class="n">hms</span><span class="p">(</span><span class="n">date1</span><span class="p">)</span> </span><span id="L-1665"><a href="#L-1665"><span class="linenos" data-line="1665"></span></a> <span class="kd">local</span> <span class="n">d2</span> <span class="o">=</span> <span class="n">date2</span><span class="p">.</span><span class="n">day</span> <span class="o">+</span> <span class="n">hms</span><span class="p">(</span><span class="n">date2</span><span class="p">)</span> </span><span id="L-1666"><a href="#L-1666"><span class="linenos" data-line="1666"></span></a> <span class="kd">local</span> <span class="n">days</span><span class="p">,</span> <span class="n">time</span> </span><span id="L-1667"><a href="#L-1667"><span class="linenos" data-line="1667"></span></a> <span class="kr">if</span> <span class="n">d1</span> <span class="o">>=</span> <span class="n">d2</span> <span class="kr">then</span> </span><span id="L-1668"><a href="#L-1668"><span class="linenos" data-line="1668"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">d1</span> <span class="o">-</span> <span class="n">d2</span> </span><span id="L-1669"><a href="#L-1669"><span class="linenos" data-line="1669"></span></a> <span class="kr">else</span> </span><span id="L-1670"><a href="#L-1670"><span class="linenos" data-line="1670"></span></a> <span class="n">months</span> <span class="o">=</span> <span class="n">months</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-1671"><a href="#L-1671"><span class="linenos" data-line="1671"></span></a> <span class="c1">-- Get days in previous month (before the "to" date) given December has 31 days.</span> </span><span id="L-1672"><a href="#L-1672"><span class="linenos" data-line="1672"></span></a> <span class="kd">local</span> <span class="n">dpm</span> <span class="o">=</span> <span class="n">m1</span> <span class="o">></span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">days_in_month</span><span class="p">(</span><span class="n">y1</span><span class="p">,</span> <span class="n">m1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">date1</span><span class="p">.</span><span class="n">calendar</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">31</span> </span><span id="L-1673"><a href="#L-1673"><span class="linenos" data-line="1673"></span></a> <span class="kr">if</span> <span class="n">d2</span> <span class="o">>=</span> <span class="n">dpm</span> <span class="kr">then</span> </span><span id="L-1674"><a href="#L-1674"><span class="linenos" data-line="1674"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">d1</span> <span class="o">-</span> <span class="n">hms</span><span class="p">(</span><span class="n">date2</span><span class="p">)</span> </span><span id="L-1675"><a href="#L-1675"><span class="linenos" data-line="1675"></span></a> <span class="kr">else</span> </span><span id="L-1676"><a href="#L-1676"><span class="linenos" data-line="1676"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">dpm</span> <span class="o">-</span> <span class="n">d2</span> <span class="o">+</span> <span class="n">d1</span> </span><span id="L-1677"><a href="#L-1677"><span class="linenos" data-line="1677"></span></a> <span class="kr">end</span> </span><span id="L-1678"><a href="#L-1678"><span class="linenos" data-line="1678"></span></a> <span class="kr">end</span> </span><span id="L-1679"><a href="#L-1679"><span class="linenos" data-line="1679"></span></a> <span class="kr">if</span> <span class="n">months</span> <span class="o"><</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1680"><a href="#L-1680"><span class="linenos" data-line="1680"></span></a> <span class="n">years</span> <span class="o">=</span> <span class="n">years</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-1681"><a href="#L-1681"><span class="linenos" data-line="1681"></span></a> <span class="n">months</span> <span class="o">=</span> <span class="n">months</span> <span class="o">+</span> <span class="mi">12</span> </span><span id="L-1682"><a href="#L-1682"><span class="linenos" data-line="1682"></span></a> <span class="kr">end</span> </span><span id="L-1683"><a href="#L-1683"><span class="linenos" data-line="1683"></span></a> <span class="n">days</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="nb">math.modf</span><span class="p">(</span><span class="n">days</span><span class="p">)</span> </span><span id="L-1684"><a href="#L-1684"><span class="linenos" data-line="1684"></span></a> <span class="kd">local</span> <span class="n">H</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">S</span> <span class="o">=</span> <span class="n">h_m_s</span><span class="p">(</span><span class="n">time</span><span class="p">)</span> </span><span id="L-1685"><a href="#L-1685"><span class="linenos" data-line="1685"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-1686"><a href="#L-1686"><span class="linenos" data-line="1686"></span></a> <span class="n">date1</span> <span class="o">=</span> <span class="n">date1</span><span class="p">,</span> </span><span id="L-1687"><a href="#L-1687"><span class="linenos" data-line="1687"></span></a> <span class="n">date2</span> <span class="o">=</span> <span class="n">date2</span><span class="p">,</span> </span><span id="L-1688"><a href="#L-1688"><span class="linenos" data-line="1688"></span></a> <span class="n">partial</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">-- avoid index lookup</span> </span><span id="L-1689"><a href="#L-1689"><span class="linenos" data-line="1689"></span></a> <span class="n">years</span> <span class="o">=</span> <span class="n">years</span><span class="p">,</span> </span><span id="L-1690"><a href="#L-1690"><span class="linenos" data-line="1690"></span></a> <span class="n">months</span> <span class="o">=</span> <span class="n">months</span><span class="p">,</span> </span><span id="L-1691"><a href="#L-1691"><span class="linenos" data-line="1691"></span></a> <span class="n">days</span> <span class="o">=</span> <span class="n">days</span><span class="p">,</span> </span><span id="L-1692"><a href="#L-1692"><span class="linenos" data-line="1692"></span></a> <span class="n">hours</span> <span class="o">=</span> <span class="n">H</span><span class="p">,</span> </span><span id="L-1693"><a href="#L-1693"><span class="linenos" data-line="1693"></span></a> <span class="n">minutes</span> <span class="o">=</span> <span class="n">M</span><span class="p">,</span> </span><span id="L-1694"><a href="#L-1694"><span class="linenos" data-line="1694"></span></a> <span class="n">seconds</span> <span class="o">=</span> <span class="n">S</span><span class="p">,</span> </span><span id="L-1695"><a href="#L-1695"><span class="linenos" data-line="1695"></span></a> <span class="n">isnegative</span> <span class="o">=</span> <span class="n">isnegative</span><span class="p">,</span> </span><span id="L-1696"><a href="#L-1696"><span class="linenos" data-line="1696"></span></a> <span class="n">iszero</span> <span class="o">=</span> <span class="n">iszero</span><span class="p">,</span> </span><span id="L-1697"><a href="#L-1697"><span class="linenos" data-line="1697"></span></a> <span class="n">age</span> <span class="o">=</span> <span class="n">_diff_age</span><span class="p">,</span> </span><span id="L-1698"><a href="#L-1698"><span class="linenos" data-line="1698"></span></a> <span class="n">duration</span> <span class="o">=</span> <span class="n">_diff_duration</span><span class="p">,</span> </span><span id="L-1699"><a href="#L-1699"><span class="linenos" data-line="1699"></span></a> <span class="p">},</span> <span class="n">diffmt</span><span class="p">)</span> </span><span id="L-1700"><a href="#L-1700"><span class="linenos" data-line="1700"></span></a><span class="kr">end</span> </span><span id="L-1701"><a href="#L-1701"><span class="linenos" data-line="1701"></span></a> </span><span id="L-1702"><a href="#L-1702"><span class="linenos" data-line="1702"></span></a><span class="kr">return</span> <span class="p">{</span> </span><span id="L-1703"><a href="#L-1703"><span class="linenos" data-line="1703"></span></a> <span class="n">_current</span> <span class="o">=</span> <span class="n">current</span><span class="p">,</span> </span><span id="L-1704"><a href="#L-1704"><span class="linenos" data-line="1704"></span></a> <span class="n">_Date</span> <span class="o">=</span> <span class="n">Date</span><span class="p">,</span> </span><span id="L-1705"><a href="#L-1705"><span class="linenos" data-line="1705"></span></a> <span class="n">_days_in_month</span> <span class="o">=</span> <span class="n">days_in_month</span><span class="p">,</span> </span><span id="L-1706"><a href="#L-1706"><span class="linenos" data-line="1706"></span></a><span class="p">}</span> </span></pre></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐5c59558b9d‐fxndg Cached time: 20241201204000 Cache expiry: 2592000 Reduced expiry: false Complications: [] CPU time usage: 0.036 seconds Real time usage: 0.112 seconds Preprocessor visited node count: 25/1000000 Post‐expand include size: 6216/2097152 bytes Template argument size: 0/2097152 bytes Highest expansion depth: 3/100 Expensive parser function count: 6/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 15265/5000000 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 81.454 1 Module:Date/doc 100.00% 81.454 1 -total --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1&useformat=desktop" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://simple.wikipedia.org/w/index.php?title=Module:Date&oldid=8554926">https://simple.wikipedia.org/w/index.php?title=Module:Date&oldid=8554926</a>"</div></div> <div id="catlinks" class="catlinks catlinks-allhidden" data-mw="interface"></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last changed on 23 November 2022, at 10:10.</li> <li id="footer-info-copyright">Text is available under the <a rel="nofollow" class="external text" href="//creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike License</a> and the <a href="/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License" title="Wikipedia:Text of the GNU Free Documentation License">GFDL</a>; additional terms may apply. See <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> for details.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:About">About Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/simple.wikipedia.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//simple.m.wikipedia.org/w/index.php?title=Module:Date&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-5c59558b9d-fxndg","wgBackendResponseTime":287,"wgPageParseReport":{"limitreport":{"cputime":"0.036","walltime":"0.112","ppvisitednodes":{"value":25,"limit":1000000},"postexpandincludesize":{"value":6216,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":3,"limit":100},"expensivefunctioncount":{"value":6,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":15265,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 81.454 1 Module:Date/doc","100.00% 81.454 1 -total"]},"cachereport":{"origin":"mw-web.codfw.main-5c59558b9d-fxndg","timestamp":"20241201204000","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>