This is an automated email from the ASF dual-hosted git repository.
git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 179be59 2023/02/17 11:37:24: Generated dev website from
groovy-website@6c546d4
179be59 is described below
commit 179be59a622af6664a2576b63c3c7e67f8bd479f
Author: jenkins <[email protected]>
AuthorDate: Fri Feb 17 11:37:24 2023 +0000
2023/02/17 11:37:24: Generated dev website from groovy-website@6c546d4
---
blog/feed.atom | 10 +
blog/groovy-dates-and-times-cheat.html | 683 +++++++++++++++++++++++++++++++++
blog/groundhog-day.html | 2 +-
blog/index.html | 4 +-
4 files changed, 696 insertions(+), 3 deletions(-)
diff --git a/blog/feed.atom b/blog/feed.atom
index 458def3..fb5fd1c 100644
--- a/blog/feed.atom
+++ b/blog/feed.atom
@@ -454,6 +454,16 @@
<published>2022-10-13T11:05:54+00:00</published>
<summary>This post looks at using KMeans to compare fruit nominated color
with the colors used in its emoji.</summary>
</entry>
+ <entry>
+ <author>
+ <name>Paul King</name>
+ </author>
+ <title>Groovy Dates And Times Cheat Sheet</title>
+ <link href="http://groovy.apache.org/blog/groovy-dates-and-times-cheat"/>
+ <updated>2022-10-24T07:27:25+00:00</updated>
+ <published>2022-10-24T07:27:25+00:00</published>
+ <summary>This post looks at data and time functionality in Groovy
including classic and Java date time, JSR310, functionality.</summary>
+ </entry>
<entry>
<author>
<name>Paul King</name>
diff --git a/blog/groovy-dates-and-times-cheat.html
b/blog/groovy-dates-and-times-cheat.html
new file mode 100644
index 0000000..29d45f5
--- /dev/null
+++ b/blog/groovy-dates-and-times-cheat.html
@@ -0,0 +1,683 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+ <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible'
content='IE=edge'/><meta name='viewport' content='width=device-width,
initial-scale=1'/><meta name='keywords' content='calendar, date, groovy,
jsr310, time'/><meta name='description' content='This post looks at data and
time functionality in Groovy including classic and Java date time, JSR310,
functionality.'/><title>The Apache Groovy programming language - Blogs - Groovy
Dates And Times Cheat Sheet</title><link href='../img/f [...]
+</head><body>
+ <div id='fork-me'>
+ <a href='https://github.com/apache/groovy'>
+ <img style='position: fixed; top: 20px; right: -58px; border: 0;
z-index: 100; transform: rotate(45deg);'
src='/img/horizontal-github-ribbon.png'/>
+ </a>
+ </div><div id='st-container' class='st-container st-effect-9'>
+ <nav class='st-menu st-effect-9' id='menu-12'>
+ <h2 class='icon icon-lab'>Socialize</h2><ul>
+ <li>
+ <a href='http://groovy-lang.org/mailing-lists.html'
class='icon'><span class='fa fa-envelope'></span> Discuss on the
mailing-list</a>
+ </li><li>
+ <a href='https://twitter.com/ApacheGroovy'
class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+ </li><li>
+ <a href='http://groovy-lang.org/events.html'
class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+ </li><li>
+ <a href='https://github.com/apache/groovy'
class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+ </li><li>
+ <a href='http://groovy-lang.org/reporting-issues.html'
class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+ </li><li>
+ <a href='http://stackoverflow.com/questions/tagged/groovy'
class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow
questions</a>
+ </li><li>
+ <a href='http://groovycommunity.com/' class='icon'><span
class='fa fa-slack'></span> Slack Community</a>
+ </li>
+ </ul>
+ </nav><div class='st-pusher'>
+ <div class='st-content'>
+ <div class='st-content-inner'>
+ <!--[if lt IE 7]>
+ <p class="browsehappy">You are using an
<strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your
experience.</p>
+ <![endif]--><div><div class='navbar navbar-default
navbar-static-top' role='navigation'>
+ <div class='container'>
+ <div class='navbar-header'>
+ <button type='button'
class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+ <span class='sr-only'></span><span
class='icon-bar'></span><span class='icon-bar'></span><span
class='icon-bar'></span>
+ </button><a class='navbar-brand'
href='../index.html'>
+ <i class='fa fa-star'></i> Apache
Groovy
+ </a>
+ </div><div class='navbar-collapse collapse'>
+ <ul class='nav navbar-nav navbar-right'>
+ <li class=''><a
href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a
href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li
class=''><a href='/download.html'>Download</a></li><li class=''><a
href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a
href='/'>Contribute</a></li><li class=''><a
href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li class=''><a
href='https://groovy.apac [...]
+ <a data-effect='st-effect-9'
class='st-trigger' href='#'>Socialize</a>
+ </li><li class=''>
+ <a href='../search.html'>
+ <i class='fa fa-search'></i>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy Dates And Times Cheat Sheet</a></li><li><a
href='#_representing_the_current_datetime' class='anchor-link'>Representing the
current date/time</a></li><li><a href='#_processing_times'
class='anchor-link'>Processing times</a></li><li><a href='#_processing_dates'
class= [...]
+<div class="sectionbody">
+<div class="paragraph">
+<p>Java has had a <code>Date</code> class from the very beginning and Groovy
supports
+using it and several related classes like <code>Calendar</code>. Throughout
this
+blog post we refer to those classes as the <strong><em>legacy date
classes</em></strong>.
+Groovy enhances the experience of using the legacy date classes
+with simpler mechanisms for formatting, parsing and extracting fields
+from the related classes.</p>
+</div>
+<div class="paragraph">
+<p>Since Java 8, the JDK has included the <a
href="https://jcp.org/en/jsr/detail?id=310">JSR-310</a>
+Date Time API. We refer to these classes as the <strong><em>new date
classes</em></strong>. The new date
+classes remove many limitations of the legacy date classes and bring some
greatly
+appreciated additional consistency. Groovy provides similar enhancements for
the
+new date classes too.</p>
+</div>
+<div class="paragraph">
+<p>Groovy’s enhancements for the legacy date classes are in the
<code>groovy-dateutil</code>
+module (prior to Groovy 2.5, this functionality was built in to the core
module).
+The <code>groovy-datetime</code> module has the enhancements for the new date
classes.
+You can include a dependency to this module in your build file or reference
+the <code>groovy-all</code> pom dependency. Both modules are part of a
standard Groovy
+install.</p>
+</div>
+<div class="paragraph">
+<p>The next few sections illustrate common date and time tasks and the code to
perform
+them using the new and legacy classes with Groovy enhancements in numerous
places.</p>
+</div>
+<div class="paragraph">
+<p><strong>Please note</strong>: that some of the formatting commands are
<em>Locale dependent</em>
+and the output <em>may vary</em> slightly if you run these examples
yourself.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_representing_the_current_datetime">Representing the current
date/time</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The legacy date classes have an abstraction which includes date and time.
If you are
+only interested in one of those two aspects, you simply ignore the other
aspect.
+The new date classes allow you to have date-only, time-only and date-time
+representations.</p>
+</div>
+<div class="paragraph">
+<p>The examples create instances representing the current date and/or time.
Various
+information is extracted from the instances and they are printed in various
ways.
+Some of the examples use the <code>SV</code> macro which prints the name and
string value of
+one or more variables.</p>
+</div>
+<table cellspacing="5px"><tbody><tr><th style="text-align:center;
padding:10px">task</th><th style="text-align:center;
padding:10px">java.time</th><th style="text-align:center;
padding:10px">legacy</th></tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px"><p><span
style="background-color: transparent;">current date and time</span></p></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println LocalDateTime.<span
style="color:#9876aa;font-style:italic;">now</span>() <span
style="color:#808080;"><br></span>println Instant.<span
style="color:#9876aa;font-style:italic;">now</span>() <span
style="color:#808080;"><br></span></pre>
+<pre>2022-10-24T12:40:02.218130200
+2022-10-24T02:40:02.223131Z
+</pre></td>
+<td style="padding:10px">
+<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println <span style="color:#cc7832;">new
</span>Date() <span style="color:#808080;"><br></span>println
Calendar.<span style="color:#9876aa;font-style:italic;">instance</span>.<span
style="color:#9876aa;">time </span><span style="color:#808080;"></span></pre>
+<pre>Mon Oct 24 12:40:02 AEST 2022
+Mon Oct 24 12:40:02 AEST 2022<br></pre></td></tr>
+<tr style="background-color:#ddddee"><td style="padding:10px">day of current
year &<br>day of current month</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println LocalDateTime.<span
style="color:#9876aa;font-style:italic;">now</span>().<span
style="color:#9876aa;">dayOfYear<br></span>println LocalDateTime.<span
style="color:#9876aa;font-style:italic;">now</span>().<span
style="color:#9876aa;">dayOfMonth<br></span></pre>
+<pre>297
+24</pre>
+</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println Calendar.<span
style="color:#9876aa;font-style:italic;">instance</span>[<span
style="color:#9876aa;font-style:italic;">DAY_OF_YEAR</span>]<br>println
Calendar.<span style="color:#9876aa;font-style:italic;">instance</span>[<span
style="color:#9876aa;font-style:italic;">DAY_OF_MONTH</span>]<br></pre><pre>297
+24</pre></td>
+</tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px">extract
today's<br>year, month & day</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var </span>now =
LocalDate.<span style="color:#9876aa;font-style:italic;">now</span>() <span
style="font-size: 9.6pt; color: rgb(128, 128, 128);">// or
LocalDateTime</span><br><br>println SV(now.<span
style="color:#9876aa;">year</span>, now.<span
style="color:#9876aa;">monthValue</span>, now.<span style="color:#9876aa;">dayO
[...]
+Today is 2022 10 24</pre></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var </span>now =
Calendar.<span style="color:#9876aa;font-style:italic;">instance<br></span>(_E,
Y, M, _WY, _WM, D) = now<br>println <span style="color:#6a8759;">"Today is
</span>$Y $<span style="font-weight:bold;">{</span>M+<span
style="color:#6897bb;">1</span><span style="font-weight:bold;">} </span>$D<span
style="color:#6a875 [...]
+Today is 2022 10 24</pre></td>
+</tr>
+<tr style="background-color:#ddddee"><td style="padding:10px">alternatives to
print today</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println now.format(<span
style="color:#6a8759;">"'Today is 'YYYY-MM-dd"</span>)<br>printf <span
style="color:#6a8759;">'Today is %1$tY-%1$tm-%1$te%n'</span>,
now</pre><pre>Today is 2022-10-24
+Today is 2022-10-24</pre></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println now.format(<span
style="color:#6a8759;">"'Today is 'YYYY-MM-dd"</span>)<br>printf <span
style="color:#6a8759;">'Today is %1$tY-%1$tm-%1$te%n'</span>,
now</pre><pre>Today is 2022-10-24
+Today is 2022-10-24</pre></td>
+</tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px"><p>extract parts
of current time</p></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">now = LocalTime.<span
style="color:#9876aa;font-style:italic;">now</span>() <span
style="color:#808080;">// or LocalDateTime<br></span>println SV(now.<span
style="color:#9876aa;">hour</span>, now.<span
style="color:#9876aa;">minute</span>, now.<span
style="color:#9876aa;">second</span>)<br>(H, M, S) = now[<span
style="color:#9876aa;font-style:italic;">HOUR_ [...]
+The time is 12:40:02</pre></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">(H, M, S) = now[<span
style="color:#9876aa;font-style:italic;">HOUR_OF_DAY</span>, <span
style="color:#9876aa;font-style:italic;">MINUTE</span>, <span
style="color:#9876aa;font-style:italic;">SECOND</span>]
+<br>println SV(H, M, S)
+<br>printf <span style="color:#6a8759;">'The time is
%02d:%02d:%02d%n</span><span style="color:#6a8759;">'</span>, H, M,
S<br></pre><pre>H=12, M=40, S=2
+The time is 12:40:02</pre></td>
+</tr>
+<tr style="background-color:#ddddee"><td style="padding:10px">alternatives to
print time</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println now.format(<span
style="color:#6a8759;">"'The time is 'HH:mm:ss"</span>)<br>printf <span
style="color:#6a8759;">'The time is %1$tH:%1$tM:%1$tS%n</span><span
style="color:#6a8759;">'</span>, now<br></pre><pre>The time is 12:40:02
+The time is 12:40:02<br></pre></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">println now.format(<span
style="color:#6a8759;">"'The time is 'HH:mm:ss"</span>)<br>printf <span
style="color:#6a8759;">'The time is %1$tH:%1$tM:%1$tS%n</span><span
style="color:#6a8759;">'</span>, now<br></pre><pre>The time is 12:40:02
+The time is 12:40:02<br></pre></td>
+</tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_processing_times">Processing times</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The new date classes have a <code>LocalTime</code> class specifically for
representing time-only quantities. The legacy date classes don’t have
such a purpose-built abstraction; you essentially just ignore the day, month,
and year parts of a date. The <code>java.sql.Time</code> class could be used as
an alternative but rarely is. The Java
+<a
href="https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html">documentation
comparing the new date classes to their legacy equivalents</a>, talks about
+using <code>GregorianCalendar</code> with the date set to the epoch value of
<code>1970-01-01</code>
+as an approximation of the <code>LocalTime</code> class. We’ll follow
that approach here
+to provide a comparison but we <em>strongly recommend</em> upgrading to the new
+classes if you need to represent time-only values or use the
+<a href="https://www.joda.org/joda-time/">Joda-Time</a> library on JDK
versions prior to 8.</p>
+</div>
+<div class="paragraph">
+<p>The examples look at representing a minute before and after midnight, and
some times at which you might eat your meals. For the meals, as well as
printing various values, we might be interested in calculating new times in
terms of existing times, e.g. lunch and dinner are 7 hours apart.</p>
+</div>
+<table cellspacing="5px"><tbody>
+<tr><th style="text-align:center; padding:10px">task</th><th
style="text-align:center; padding:10px">java.time</th><th
style="text-align:center; padding:10px">legacy</th></tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px">one min after
midnight</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">LocalTime.<span
style="color:#9876aa;font-style:italic;">of</span>(<span
style="color:#6897bb;">0</span>, <span style="color:#6897bb;">1</span>).with
<span style="font-weight:bold;">{<br></span><span style="font-weight:bold;">
</span>println format(<span style="color:#6a8759;">'HH:mm'</span>)<br>
println format(<span style="color:#6a8759;">'hh:mm a'</ [...]
+12:01 am
+0:01 am</pre></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">Calendar.<span
style="color:#9876aa;font-style:italic;">instance</span>.with <span
style="font-weight:bold;">{<br></span><span style="font-weight:bold;">
</span>clear()<br> set(<span
style="color:#9876aa;font-style:italic;">MINUTE</span>, <span
style="color:#6897bb;">1</span>)<br> println format(<span
style="color:#6a8759;">'HH:mm'</span>)<br> p [...]
+12:01 am
+0:01 am</pre></td>
+</tr>
+<tr style="background-color:#ddddee"><td style="padding:10px">one min before
midnight</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">LocalTime.<span
style="color:#9876aa;font-style:italic;">of</span>(<span
style="color:#6897bb;">23</span>, <span style="color:#6897bb;">59</span>).with
<span style="font-weight:bold;">{<br></span><span style="font-weight:bold;">
</span>println format(<span style="color:#6a8759;">'HH:mm'</span>)<br>
println format(<span style="color:#6a8759;">'hh:mm a' [...]
+11:59 pm
+11:59 pm</pre></td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;">Calendar.<span
style="color:#9876aa;font-style:italic;">instance</span>.with <span
style="font-weight:bold;">{<br></span><span style="font-weight:bold;">
</span>clear()<br> set(<span style="color:#6a8759;">hourOfDay</span>: <span
style="color:#6897bb;">23</span>, <span style="color:#6a8759;">minute</span>:
<span style="color:#6897bb;">59</span>)<br> [...]
+11:59 pm
+11:59 pm</pre></td>
+</tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px">meal times</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var
</span>breakfast = LocalTime.<span
style="color:#9876aa;font-style:italic;">of</span>(<span
style="color:#6897bb;">7</span>, <span
style="color:#6897bb;">30</span>)<br><span style="color:#cc7832;">var
</span>lunch = LocalTime.<span
style="color:#9876aa;font-style:italic;">parse</span>(<span
style="color:#6a8759;">'12:30'</sp [...]
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var
</span>breakfast = Date.<span
style="color:#9876aa;font-style:italic;">parse</span>(<span
style="color:#6a8759;">'hh:mm'</span>, <span
style="color:#6a8759;">'07:30'</span>)<br><span style="color:#cc7832;">var
</span>lunch = Calendar.<span
style="color:#9876aa;font-style:italic;">instance</span>.tap <span
style="font-weight: [...]
+</tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_processing_dates">Processing dates</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>To represent date-only information with the legacy date classes, you set
the time
+aspects to zero, or simply ignore them. Alternatively, you could consider the
less
+commonly used <code>java.sql.Date</code> class. The new date classes have the
special
+<code>LocalDate</code> class for this purpose which we highly recommend.</p>
+</div>
+<div class="paragraph">
+<p>The examples create dates for Halloween and Melbourne Cup day (a public
holiday in
+the Australia state of Victoria). We look at various properties of those two
dates.</p>
+</div>
+<table cellspacing="5px"><tbody>
+<tr><th style="text-align:center; padding:10px">task</th><th
style="text-align:center; padding:10px">java.time</th><th
style="text-align:center; padding:10px">legacy</th></tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px">holidays</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var
</span>halloween22 = LocalDate.<span
style="color:#9876aa;font-style:italic;">of</span>(<span
style="color:#6897bb;">2022</span>, <span style="color:#6897bb;">10</span>,
<span style="color:#6897bb;">31</span>)<br><span style="color:#cc7832;">var
</span>halloween23 = LocalDate.<span
style="color:#9876aa;font-style:italic;">pa [...]
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var
</span>halloween21 = Date.<span
style="color:#9876aa;font-style:italic;">parse</span>(<span
style="color:#6a8759;">'dd/MM/yyyy'</span>, <span
style="color:#6a8759;">'31/10/2021'</span>)<br><span style="color:#cc7832;">var
</span>halloween22 = Date.<span
style="color:#9876aa;font-style:italic;">parse</span>(<span style="color [...]
+</tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_processing_date_and_time_combinations">Processing date and time
combinations</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The new date classes use <code>LocalDateTime</code> to represent a quantity
with both
+date and time aspects. Many of the methods seen earlier will also be
applicable here.</p>
+</div>
+<div class="paragraph">
+<p>The examples show creating and printing a representation of lunch on
Melbourne Cup day.</p>
+</div>
+<table cellspacing="5px"><tbody>
+<tr><th style="text-align:center; padding:10px">task</th><th
style="text-align:center; padding:10px">java.time</th><th
style="text-align:center; padding:10px">legacy</th></tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px">holidays</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var
</span>melbourneCupLunch = LocalDateTime.<span
style="color:#9876aa;font-style:italic;">of</span>(<span
style="color:#6897bb;">2022</span>, <span style="color:#6897bb;">11</span>,
<span style="color:#6897bb;">1</span>, <span style="color:#6897bb;">12</span>,
<span style="color:#6897bb;">30</span>)<br><span style="color:#cc78 [...]
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var
</span>melbourneCupLunch = <span style="color:#cc7832;">new
</span>GregorianCalendar(<span style="color:#6897bb;">2022</span>, <span
style="color:#6897bb;">10</span>, <span style="color:#6897bb;">1</span>, <span
style="color:#6897bb;">12</span>, <span style="color:#6897bb;">30</span>).<span
style="color:#9876aa;">time<br></s [...]
+</tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_processing_zoned_date_and_times">Processing zoned date and times</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The legacy date classes have the concept of a <code>TimeZone</code>,
predominantly used by
+the Calendar class. The new date classes has a similar concept but uses the
+<code>ZoneId</code>, <code>ZoneOffset</code>, and <code>ZonedDateTime</code>
classes (among others).</p>
+</div>
+<div class="paragraph">
+<p>The examples show various properties of zones and show that during the
Melbourne cup
+breakfast, it would still be the night before (Halloween) in Los Angeles. They
also
+show that those two zones are 18 hours apart at that time of the year.</p>
+</div>
+<table cellspacing="5px"><tbody>
+<tr><th style="text-align:center; padding:10px">task</th><th
style="text-align:center; padding:10px">java.time</th><th
style="text-align:center; padding:10px">legacy</th></tr>
+<tr style="background-color:#ddeedd"><td style="padding:10px">holidays</td>
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var </span>aet =
ZoneId.<span style="color:#9876aa;font-style:italic;">of</span>(<span
style="color:#6a8759;">'Australia/Sydney'</span>)<br><span
style="color:#cc7832;">assert </span>aet.<span style="color:#9876aa;">fullName
</span>== <span style="color:#6a8759;">'Australian Eastern Time'
</span>&& aet.<span style="color [...]
+<td style="padding:10px"><pre
style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains
Mono',monospace;font-size:9.6pt;"><span style="color:#cc7832;">var </span>aet =
TimeZone.<span
style="color:#9876aa;font-style:italic;">getTimeZone</span>(<span
style="color:#6a8759;">'Australia/Sydney'</span>)<br><span
style="color:#cc7832;">assert </span>aet.<span
style="color:#9876aa;">displayName </span>== <span
style="color:#6a8759;">'Australian Eastern Standard Time'<br></span><span s
[...]
+</div>
+</div>
+<div class="sect1">
+<h2 id="_other_useful_classes">Other useful classes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The new date classes offer a few more useful classes. Here are some of the
common ones:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>OffsetDateTime</code> - like <code>ZonedDateTime</code> but with just
an offset from UTC rather than a full time-zone</p>
+</li>
+<li>
+<p><code>Instant</code> - like <code>OffsetDateTime</code> but tied to UTC</p>
+</li>
+<li>
+<p><code>YearMonth</code> - like a <code>LocalDate</code> but with no day
component</p>
+</li>
+<li>
+<p><code>MonthDay</code> - like a <code>LocalDate</code> but with no year
component</p>
+</li>
+<li>
+<p><code>Period</code> - used to represent periods of time,
e.g. `Period.ofDays(14)<code>, `Period.ofYears(2)</code>; see also the
<code>LocalDate</code> example above.</p>
+</li>
+<li>
+<p><code>Duration</code> - a time-based amount of time, e.g.
<code>Duration.ofSeconds(30)</code>, <code>Duration.ofHours(7)</code>; see also
the <code>LocalTime</code> example above.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_conversions">Conversions</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>It is useful to convert between the new and legacy classes.
+Some useful conversion methods are shown below with Groovy
+enhancements shown in <span class="blue">blue</span>.</p>
+</div>
+<table style="width:70%;">
+<tbody style="background-color:#eeeeee;">
+<tr><th>From</th><th>Conversion method/property</th></tr>
+<tr><td>GregorianCalendar </td><td><pre>toInstant()
+toZonedDateTime()
+from(ZonedDateTime)
+</pre></td></tr>
+<tr><td>Calendar</td><td><pre>toInstant()
+<span style="color:blue">toZonedDateTime()
+toOffsetDateTime()
+toLocalDateTime()
+toLocalDate()
+toLocalTime()
+toOffsetTime()
+toDayOfWeek()
+toYear()
+toYearMonth()
+toMonth()
+toMonthDay()
+zoneOffset
+zoneId
+</span></pre></td></tr>
+<tr><td>Date</td>
+<td><pre>toInstant()
+from(Instant)
+<span style="color:blue">toZonedDateTime()
+toOffsetDateTime()
+toLocalDateTime()
+toLocalDate()
+toLocalTime()
+toOffsetTime()
+toDayOfWeek()
+toYear()
+toYearMonth()
+toMonth()
+toMonthDay()
+zoneOffset
+zoneId
+</span></pre></td></tr>
+<tr><td>ZonedDateTime<br>OffsetDateTime<br>LocalDateTime<br>LocalDate<br>LocalTime</td>
+<td><pre><span style="color:blue">toDate()
+toCalendar()
+</span></pre></td></tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_simpledateformat_patterns">SimpleDateFormat patterns</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>We saw several examples above using the <code>format</code> and
<code>parse</code> methods.
+For the legacy date classes, numerous Groovy enhancements delegate to
+<a
href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/SimpleDateFormat.html"><code>SimpleDateFormat</code></a>.
+This class represents date/time formats using pattern strings. These are
special
+letters to represent some time or date component mixed with escaped literal
strings.
+The special letters are often repeated to represent the minimum size field for
number
+components and whether the full or an abbreviated form is used for other
components.</p>
+</div>
+<div class="paragraph">
+<p>As an example, for the U.S. locale and U.S. Pacific Time time zone, the
following
+pattern:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>yyyy.MM.dd G 'at' HH:mm:ss z</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>would apply to the following text:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>2001.07.04 AD at 12:08:56 PDT</pre>
+</div>
+</div>
+<table>
+<tbody style="background-color:#eeeeee">
+<tr><th>Letter </th><th>Description</th></tr>
+<tr><td>G</td><td>Era designator <code>AD</code></td></tr>
+<tr><td>y</td><td>Year <code>1996; 96</code></td></tr>
+<tr><td>Y</td><td>Week year (similar to year but allotted by weeks; the
first/last few days of a year might be allotted to finish/start the
last/previous week)</td></tr>
+<tr><td>M</td><td>Month in year (context sensitive) <code>July; Jul;
07</code></td></tr>
+<tr><td>L</td><td>Month in year (standalone form) <code>July; Jul;
07</code></td></tr>
+<tr><td>w</td><td>Week in year <code>27</code></td></tr>
+<tr><td>W</td><td>Week in month <code>2</code></td></tr>
+<tr><td>D</td><td>Day in year <code>189</code></td></tr>
+<tr><td>d</td><td>Day in month <code>10</code></td></tr>
+<tr><td>F</td><td>Day of week in month <code>2</code></td></tr>
+<tr><td>E</td><td>Day name in week <code>Tuesday; Tue</code></td></tr>
+<tr><td>u</td><td>Day number of week (1 = Monday, ..., 7 = Sunday)</td></tr>
+<tr><td>a</td><td>Am/pm marker <code>PM</code></td></tr>
+<tr><td>H</td><td>Hour in day (0-23) <code>0</code></td></tr>
+<tr><td>k</td><td>Hour in day (1-24) <code>24</code></td></tr>
+<tr><td>K</td><td>Hour in am/pm (0-11) <code>0</code></td></tr>
+<tr><td>h</td><td>Hour in am/pm (1-12) <code>12</code></td></tr>
+<tr><td>m</td><td>Minute in hour <code>30</code></td></tr>
+<tr><td>s</td><td>Second in minute <code>55</code></td></tr>
+<tr><td>S</td><td>Millisecond <code>978</code></td></tr>
+<tr><td>z</td><td>Time zone <code>Pacific Standard Time; PST;
GMT-08:00</code></td></tr>
+<tr><td>Z</td><td>Time zone (RFC 822) <code>-0800</code></td></tr>
+<tr><td>X</td><td>Time zone (ISO 8601) <code>-08; -0800;
-08:00</code></td></tr>
+<tr><td>'</td><td>to escape text put a single quote on either side</td></tr>
+<tr><td>''</td><td>two single quotes for a literal single quote
<code>'</code></td></tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_datetimeformatter_patterns">DateTimeFormatter patterns</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Groovy’s <code>format</code> and <code>parse</code> enhancements for
the new date classes delegate
+to the <a
href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/DateTimeFormatter.html"><code>DateTimeFormatter</code></a>
class.
+Its behavior is similar to what we saw for <code>SimpleDateFormat</code>
+but with slightly different conversion letters:</p>
+</div>
+<table>
+<tbody style="background-color:#eeeeee">
+<tr><th>Conversion suffix </th><th>Description</th></tr>
+<tr><td>G</td><td>era <code>AD</code></td></tr>
+<tr><td>u</td><td>year <code>2004; 04</code></td></tr>
+<tr><td>y</td><td>year-of-era <code>2004; 04</code></td></tr>
+<tr><td>D</td><td>day-of-year <code>189</code></td></tr>
+<tr><td>M/L</td><td>month-of-year <code>7; 07; Jul; July; J</code></td></tr>
+<tr><td>d</td><td>day-of-month <code>10</code></td></tr>
+<tr><td>Q/q</td><td>quarter-of-year <code>3; 03; Q3; 3rd
quarter</code></td></tr>
+<tr><td>Y</td><td>week-based-year <code>1996; 96</code></td></tr>
+<tr><td>w</td><td>week-of-week-based-year <code>27</code></td></tr>
+<tr><td>W</td><td>week-of-month <code>4</code></td></tr>
+<tr><td>E</td><td>day-of-week <code>Tue; Tuesday; T</code></td></tr>
+<tr><td>e/c</td><td>localized day-of-week <code>2; 02; Tue; Tuesday;
T</code></td></tr>
+<tr><td>F</td><td>week-of-month <code>3</code></td></tr>
+<tr><td>a</td><td>am-pm-of-day <code>PM</code></td></tr>
+<tr><td>h</td><td>clock-hour-of-am-pm (1-12) <code>12</code></td></tr>
+<tr><td>K</td><td>hour-of-am-pm (0-11) <code>0</code></td></tr>
+<tr><td>k</td><td>clock-hour-of-am-pm (1-24) <code>0</code></td></tr>
+<tr><td>H</td><td>hour-of-day (0-23) <code>0</code></td></tr>
+<tr><td>m</td><td>minute-of-hour <code>30</code></td></tr>
+<tr><td>s</td><td>second-of-minute <code>55</code></td></tr>
+<tr><td>S</td><td>fraction-of-second <code>978</code></td></tr>
+<tr><td>A</td><td>milli-of-day <code>1234</code></td></tr>
+<tr><td>n</td><td>nano-of-second <code>987654321</code></td></tr>
+<tr><td>N</td><td>nano-of-day <code>1234000000</code></td></tr>
+<tr><td>V</td><td>time-zone ID <code>America/Los_Angeles; Z;
-08:30</code></td></tr>
+<tr><td>z</td><td>time-zone name <code>Pacific Standard Time;
PST</code></td></tr>
+<tr><td>O</td><td>localized zone-offset <code>GMT+8; GMT+08:00;
UTC-08:00;</code></td></tr>
+<tr><td>X</td><td>zone-offset 'Z' for zero <code>Z; -08; -0830; -08:30;
-083015; -08:30:15;</code></td></tr>
+<tr><td>x</td><td>zone-offset <code>+0000; -08; -0830; -08:30; -083015;
-08:30:15;</code></td></tr>
+<tr><td>Z</td><td>zone-offset <code>+0000; -0800; -08:00;</code></td></tr>
+<tr><td>p</td><td>pad next</td></tr>
+<tr><td>'</td><td>to escape text put a single quote on either side</td></tr>
+<tr><td>''</td><td>two single quotes for a literal single quote
<code>'</code></td></tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="localizedPatterns">Localized Patterns</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>JDK19 adds the <code>ofLocalizedPattern(String requestedTemplate)</code>
method.
+The requested template is one or more regular expression pattern symbols
ordered
+from the largest to the smallest unit, and consisting of the following
patterns:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre> "G{0,5}" + // Era
+ "y*" + // Year
+ "Q{0,5}" + // Quarter
+ "M{0,5}" + // Month
+ "w*" + // Week of Week Based Year
+ "E{0,5}" + // Day of Week
+ "d{0,2}" + // Day of Month
+ "B{0,5}" + // Period/AmPm of Day
+ "[hHjC]{0,2}" + // Hour of Day/AmPm (refer to LDML for 'j' and 'C')
+ "m{0,2}" + // Minute of Hour
+ "s{0,2}" + // Second of Minute
+ "[vz]{0,4}" // Zone</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The requested template is mapped to the closest of available localized
format as
+defined by the <a
href="https://www.unicode.org/reports/tr35/tr35-dates.html#availableFormats_appendItems">Unicode
LDML specification</a>.
+Here is an example of usage:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var now =
ZonedDateTime.now()
+var columns = '%7s | %10s | %10s | %10s | %14s%n'
+printf columns, 'locale', 'GDK', 'custom', 'local', 'both'
+[locale('en', 'US'),
+ locale('ro', 'RO'),
+ locale('vi', 'VN')].each { locale ->
+ Locale.default = locale
+ var gdk = now.format('y-MM-dd')
+ var custom = now.format(ofPattern('y-MM-dd'))
+ var local = now.format(ofLocalizedDate(SHORT))
+ var both = now.format(ofLocalizedPattern('yMM'))
+ printf columns, locale, gdk, custom, local, both
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which has this output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>locale | GDK | custom | local | both
+ en_US | 2022-12-18 | 2022-12-18 | 12/18/22 | 12/2022
+ ro_RO | 2022-12-18 | 2022-12-18 | 18.12.2022 | 12.2022
+ vi_VN | 2022-12-18 | 2022-12-18 | 18/12/2022 | tháng 12, 2022</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Example credit: <a
href="https://twitter.com/nipafx/status/1604152548503461891">this example</a>
from <a href="https://twitter.com/nipafx">Nicolai Parlog</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_formatter_formats">Formatter formats</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The <a
href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Formatter.html"><code>java.util.Formatter</code></a>
class is a base class in Java for various kinds of
+formatting. It can be used directly, via <code>String.format</code>,
<code>parse</code>, <code>printf</code>, or
+Groovy’s <code>sprintf</code>.
+We saw several examples of using <code>printf</code> and <code>parse</code>
formatting in the above examples.</p>
+</div>
+<div class="paragraph">
+<p>The <code>Formatter</code> class has methods which take a format string as
its first argument
+and zero or more additional arguments.
+The format string typically has one or more format specifiers (starting with a
+percent character) which indicate that a formatted version of one of the
additional
+arguments should be placed into the string at that point.
+The general form of a format specifier is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint
highlight"><code>%[argument_index$][flag][width][.precision]conversion</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Most of the parts are optional. The <code>argument_index</code> part is
only used when referencing
+one of the additional arguments more than once (or out of order). The
<code>precision</code> part
+is only used for floating point numbers. The <code>flag</code> part is used to
indicate always
+include sign(+), zero-padding(0), locale-specific comma delimiters(,), and left
+justification(-).
+The <code>width</code> indicates the minimum number of characters for the
output.
+The <code>conversion</code> indicates how the argument should be processed,
e.g. as a numeric
+field, a date, a special character, or some other special processing. Upper and
+lowercase variants exist for most conversions which, for the uppercase variant,
+will call <code>toUpperCase</code> after the conversion is complete.</p>
+</div>
+<table>
+<tbody style="background-color:#eeeeee">
+<tr><th>Conversion </th><th>Description</th></tr>
+<tr><td>'b', 'B'</td><td>Treat as a boolean or false if null</td></tr>
+<tr><td>'h', 'H'</td><td>Output the arguments hashcode as a hex
string</td></tr>
+<tr><td>'s', 'S'</td><td>Treat as a String</td></tr>
+<tr><td>'c', 'C'</td><td>Treat as a Unicode character</td></tr>
+<tr><td>'d'</td><td>Treat as a decimal integer</td></tr>
+<tr><td>'o'</td><td>Treat as an octal integer</td></tr>
+<tr><td>'x', 'X'</td><td>Treat as a hexadecimal integer</td></tr>
+<tr><td>'e', 'E'</td><td>Treat as a decimal number in scientific
notation</td></tr>
+<tr><td>'f'</td><td>Treat as a floating point number</td></tr>
+<tr><td>'g', 'G'</td><td>Treat as a floating point in either decimal or
scientific notation</td></tr>
+<tr><td>'a', 'A'</td><td>Treat as a hexadecimal floating-point number</td></tr>
+<tr><td>'t', 'T'</td><td>Treat as the <i>prefix </i>for a date/time
conversion</td></tr>
+<tr><td>'%'</td><td>A literal percent</td></tr>
+<tr><td>'n'</td><td>A line separator</td></tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>When the date/time prefix is used, additional suffixes are applicable.</p>
+</div>
+<div class="paragraph">
+<p>For formatting times:</p>
+</div>
+<table>
+<tbody style="background-color:#eeeeee">
+<tr><th>Conversion suffix </th><th>Description</th></tr>
+<tr><td>'H'</td><td>Hour of the day for the 24-hour clock as two digits
<code>00 - 23</code></td></tr>
+<tr><td>'I'</td><td>Hour for the 12-hour clock as two digits <code>01 -
12</code></td></tr>
+<tr><td>'k'</td><td>Hour of the day for the 24-hour clock <code>0 -
23</code></td></tr>
+<tr><td>'l'</td><td>Hour for the 12-hour clock <code>1 - 12</code></td></tr>
+<tr><td>'M'</td><td>Minute within the hour as two digits <code>00 -
59</code></td></tr>
+<tr><td>'S'</td><td>Seconds within the minute as two digits <code>00 -
60</code><br>("60" is used for leap seconds)</td></tr>
+<tr><td>'L'</td><td>Millisecond within the second as three digits <code>000 -
999</code></td></tr>
+<tr><td>'N'</td><td>Nanosecond within the second as nine digits
<code>000000000 - 999999999</code></td></tr>
+<tr><td>'p'</td><td>Locale-specific morning or afternoon marker in lower case,
<code>am</code> or <code>pm</code><br>(The conversion prefix 'T' forces this
output to upper case)</td></tr>
+<tr><td>'z'</td><td>RFC 822 style numeric time zone offset from GMT
<code>-0800</code><br>(Adjusted as needed for Daylight Saving Time)</td></tr>
+<tr><td>'Z'</td><td>Abbreviated time zone</td></tr>
+<tr><td>'s'</td><td>Seconds since the beginning of the epoch starting at 1
January 1970 00:00:00 UTC</td></tr>
+<tr><td>'Q'</td><td>Milliseconds since the beginning of the epoch starting at
1 January 1970 00:00:00 UTC</td></tr>
+</tbody></table>
+<div class="paragraph">
+<p>For formatting dates:</p>
+</div>
+<table>
+<tbody style="background-color:#eeeeee">
+<tr><th>Conversion suffix </th><th>Description</th></tr>
+<tr><td>'B'</td><td>Locale-specific full month name
<code>January</code></td></tr>
+<tr><td>'b', 'h'</td><td>Locale-specific abbreviated month name
<code>Jan</code></td></tr>
+<tr><td>'A'</td><td>Locale-specific full name of the day of the week
<code>Sunday</code></td></tr>
+<tr><td>'a'</td><td>Locale-specific short name of the day of the week
<code>Sun</code></td></tr>
+<tr><td>'C'</td><td>First two digits of four-digit year <code>00 -
99</code></td></tr>
+<tr><td>'Y'</td><td>Year as four digits <code>0092</code></td></tr>
+<tr><td>'y'</td><td>Last two digits of the year <code>00 - 99</code></td></tr>
+<tr><td>'j'</td><td>Day of year as three digits <code>001 -
366</code></td></tr>
+<tr><td>'m'</td><td>Month as two digits <code>01 -
13<code></code></code></td></tr>
+<tr><td>'d'</td><td>Day of month as two digits <code>01 - 31</code></td></tr>
+<tr><td>'e'</td><td>Day of month <code>1 - 31</code></td></tr>
+</tbody></table>
+<div class="paragraph">
+<p>For formatting date/time compositions:</p>
+</div>
+<table>
+<tbody style="background-color:#eeeeee">
+<tr><th>Conversion suffix </th><th>Description</th></tr>
+<tr><td>'R'</td><td>Time formatted for the 24-hour clock as "%tH:%tM"</td></tr>
+<tr><td>'T'</td><td>Time formatted for the 24-hour clock as
"%tH:%tM:%tS"</td></tr>
+<tr><td>'r'</td><td>Time formatted for the 12-hour clock as "%tI:%tM:%tS
%Tp"<br>The location of the morning or afternoon marker ('%Tp') may be
locale-dependent.</td></tr>
+<tr><td>'D'</td><td>Date formatted as "%tm/%td/%ty"</td></tr>
+<tr><td>'F'</td><td>ISO 8601 date formatted as "%tY-%tm-%td"</td></tr>
+<tr><td>'c'</td><td>Date and time formatted as "%ta %tb %td %tT %tZ %tY"
<code>Sun Jul 21 15:17:00 EDT 1973</code></td></tr>
+</tbody></table>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_further_information">Further information</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p>Java 8 LocalDate, LocalDateTime, Instant <a
href="https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant">tutorial</a></p>
+</li>
+<li>
+<p><a href="https://www.baeldung.com/java-8-date-time-intro">Introduction</a>
to the Java 8 Date/Time API</p>
+</li>
+<li>
+<p>A <a href="https://www.baeldung.com/java-simple-date-format">guide</a> to
SimpleDateFormat</p>
+</li>
+<li>
+<p>Joda-Time <a href="https://www.joda.org/joda-time/">website</a></p>
+</li>
+<li>
+<p><a
href="https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html">Guidelines</a>
for Date-Time/legacy date interoperability</p>
+</li>
+<li>
+<p>Source code: <a
href="https://github.com/paulk-asert/groovy-cheat-sheets/blob/main/src/main/groovy/DateTimeExamples.groovy">examples
for new date classes</a></p>
+</li>
+<li>
+<p>Source code: <a
href="https://github.com/paulk-asert/groovy-cheat-sheets/blob/main/src/main/groovy/DateUtilExamples.groovy">examples
for legacy date classes</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+ <div class='row'>
+ <div class='colset-3-footer'>
+ <div class='col-1'>
+ <h1>Groovy</h1><ul>
+ <li><a
href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a
href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a
href='/download.html'>Download</a></li><li><a
href='http://groovy-lang.org/support.html'>Support</a></li><li><a
href='/'>Contribute</a></li><li><a
href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li><a
href='https://groovy.apache.org/events.html'></a></li>
+ </ul>
+ </div><div class='col-2'>
+ <h1>About</h1><ul>
+ <li><a
href='https://github.com/apache/groovy'>Source code</a></li><li><a
href='http://groovy-lang.org/security.html'>Security</a></li><li><a
href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a
href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a
href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a
href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a
href='http://groovy-lang.org/sea [...]
+ </ul>
+ </div><div class='col-3'>
+ <h1>Socialize</h1><ul>
+ <li><a
href='http://groovy-lang.org/mailing-lists.html'>Discuss on the
mailing-list</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on
Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and
conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code
on GitHub</a></li><li><a
href='http://groovy-lang.org/reporting-issues.html'>Report issues in
Jira</a></li><li><a href='http://stackoverflow.com [...]
+ </ul>
+ </div><div class='col-right'>
+ <p>
+ The Groovy programming language is
supported by the <a href='http://www.apache.org'>Apache Software Foundation</a>
and the Groovy community.
+ </p><div text-align='right'>
+ <img src='../img/asf_logo.png'
title='The Apache Software Foundation' alt='The Apache Software Foundation'
style='width:60%'/>
+ </div><p>Apache® and the Apache
feather logo are either registered trademarks or trademarks of The Apache
Software Foundation.</p>
+ </div>
+ </div><div class='clearfix'>© 2003-2023
the Apache Groovy project — Groovy is Open Source: <a
href='http://www.apache.org/licenses/LICENSE-2.0.html' alt='Apache 2
License'>license</a>, <a
href='https://privacy.apache.org/policies/privacy-policy-public.html'>privacy
policy</a>.</div>
+ </div>
+ </footer></div>
+ </div>
+ </div>
+ </div>
+ </div><script src='../js/vendor/jquery-1.10.2.min.js'
defer></script><script src='../js/vendor/classie.js' defer></script><script
src='../js/vendor/bootstrap.js' defer></script><script
src='../js/vendor/sidebarEffects.js' defer></script><script
src='../js/vendor/modernizr-2.6.2.min.js' defer></script><script
src='../js/plugins.js' defer></script><script
src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoa
[...]
+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new
Date();a=s.createElement(o),
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+ ga('create', 'UA-257558-10', 'auto');
+ ga('send', 'pageview');
+ </script>
+</body></html>
\ No newline at end of file
diff --git a/blog/groundhog-day.html b/blog/groundhog-day.html
index 28e1332..7959f13 100644
--- a/blog/groundhog-day.html
+++ b/blog/groundhog-day.html
@@ -53,7 +53,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groundhog Day</a></li></ul></div><div class='col-lg-8
col-lg-pull-0'><a name='doc'></a><h1>Groundhog Day</h1><p><span>Author: <i>Paul
King</i></span><br/><span>Published: 2023-02-02 12:00AM</span></p><hr/><div
class="paragraph">
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groundhog Day</a></li></ul><br/><ul class='nav-sidebar'><li
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related
posts</span></li><li><a href='./groovy-dates-and-times-cheat'>Groovy Dates And
Times Cheat Sheet</a></li></ul></div><div class='col-lg-8 col-lg [...]
<p><a href="https://twitter.com/kenkousen">Ken Kousen</a> posted a
<a href="https://twitter.com/kenkousen/status/1621272529481367554">tweet</a>
in honor of <a href="https://en.wikipedia.org/wiki/Groundhog_Day">Groundhog
Day</a>
diff --git a/blog/index.html b/blog/index.html
index bdb0f7e..68a3412 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -53,7 +53,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul
class='nav-sidebar list'><li class='active'><a
href='/blog/'>Blogs</a></li><li><a href='wordle-checker'>Checking Wordle with
Groovy</a></li><li><a href='groovy-null-processing'>Groovy Processing Nulls In
Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a
href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href=' [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul
class='nav-sidebar list'><li class='active'><a
href='/blog/'>Blogs</a></li><li><a href='wordle-checker'>Checking Wordle with
Groovy</a></li><li><a href='groovy-null-processing'>Groovy Processing Nulls In
Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a
href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href=' [...]
<div class='row'>
<div class='colset-3-footer'>
<div class='col-1'>
@@ -97,7 +97,7 @@
colors: am5.ColorSet.new(root, {})
}));
wc.data.setAll([
- { category: "centroids", value: 1 }, { category: "data
science", value: 7 }, { category: "groovy", value: 55 }, { category: "kmeans",
value: 3 }, { category: "records", value: 5 }, { category: "apache spark",
value: 1 }, { category: "apache wayang", value: 1 }, { category: "release",
value: 23 }, { category: "decryption", value: 1 }, { category: "encryption",
value: 1 }, { category: "security", value: 1 }, { category: "bouncy castle",
value: 1 }, { category: "domain speci [...]
+ { category: "centroids", value: 1 }, { category: "data
science", value: 7 }, { category: "groovy", value: 56 }, { category: "kmeans",
value: 3 }, { category: "records", value: 5 }, { category: "apache spark",
value: 1 }, { category: "apache wayang", value: 1 }, { category: "release",
value: 23 }, { category: "decryption", value: 1 }, { category: "encryption",
value: 1 }, { category: "security", value: 1 }, { category: "bouncy castle",
value: 1 }, { category: "domain speci [...]
]);
wc.labels.template.setAll({
paddingTop: 5,