CINXE.COM
<!doctype html><html lang="en"><head><title data-rh="true">Parse ISO 8601 String With Timezone Offset To Date Object In Groovy | by LoopedNetwork | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2022-01-02T14:35:25.572Z"/><meta data-rh="true" name="title" content="Parse ISO 8601 String With Timezone Offset To Date Object In Groovy | by LoopedNetwork | Medium"/><meta data-rh="true" property="og:title" content="Parse ISO 8601 String With Timezone Offset To Date Object In Groovy"/><meta data-rh="true" property="al:android:url" content="medium://p/17c2c47d26f2"/><meta data-rh="true" property="al:ios:url" content="medium://p/17c2c47d26f2"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="My Groovy posts always have the absolute worst titles, but I figure that making them verbose is really the only way to make them discoverable. I write a good bit of Groovy code at work, and given…"/><meta data-rh="true" property="og:description" content="My Groovy posts always have the absolute worst titles, but I figure that making them verbose is really the only way to make them…"/><meta data-rh="true" property="og:url" content="https://loopednetwork.medium.com/parse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2"/><meta data-rh="true" property="al:web:url" content="https://loopednetwork.medium.com/parse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2"/><meta data-rh="true" property="article:author" content="https://loopednetwork.medium.com"/><meta data-rh="true" name="author" content="LoopedNetwork"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Parse ISO 8601 String With Timezone Offset To Date Object In Groovy"/><meta data-rh="true" name="twitter:site" content="@Medium"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/17c2c47d26f2"/><meta data-rh="true" property="twitter:description" content="My Groovy posts always have the absolute worst titles, but I figure that making them verbose is really the only way to make them…"/><meta data-rh="true" name="twitter:card" content="summary"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="4 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://loopednetwork.medium.com"/><link data-rh="true" rel="canonical" href="https://looped.network/parse-iso-8601-string-with-timezone-offset-to-string-in-groovy/"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/17c2c47d26f2"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fda:true\u002Fbd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"url":"https:\u002F\u002Floopednetwork.medium.com\u002Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2","dateCreated":"2021-01-18T23:52:15.000Z","datePublished":"2021-01-18T23:52:15.000Z","dateModified":"2022-01-02T14:35:32.328Z","headline":"Parse ISO 8601 String With Timezone Offset To Date Object In Groovy","name":"Parse ISO 8601 String With Timezone Offset To Date Object In Groovy","description":"My Groovy posts always have the absolute worst titles, but I figure that making them verbose is really the only way to make them discoverable. I write a good bit of Groovy code at work, and given…","identifier":"17c2c47d26f2","author":{"@type":"Person","name":"LoopedNetwork","url":"https:\u002F\u002Floopednetwork.medium.com"},"creator":["LoopedNetwork"],"publisher":{"@type":"Organization","name":"Medium","url":"https:\u002F\u002Floopednetwork.medium.com\u002F","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Floopednetwork.medium.com\u002Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2"}</script><style type="text/css" data-fela-rehydration="532" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="532" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:#1A8917}.es{border-color:#1A8917}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:#1A8917}.ez:disabled:hover{border-color:#1A8917}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-bottom:2px}.ii{flex-wrap:nowrap}.ij{font-size:16px}.ik{line-height:24px}.im{margin:0 8px}.in{display:inline}.io{color:#1A8917}.ip{fill:#1A8917}.is{flex:0 0 auto}.iv{flex-wrap:wrap}.iw{padding-left:8px}.ix{padding-right:8px}.jy> *{flex-shrink:0}.jz{overflow-x:scroll}.ka::-webkit-scrollbar{display:none}.kb{scrollbar-width:none}.kc{-ms-overflow-style:none}.kd{width:74px}.ke{flex-direction:row}.kf{z-index:2}.kg{margin-right:4px}.kj{-webkit-user-select:none}.kk{border:0}.kl{fill:rgba(117, 117, 117, 1)}.ko{outline:0}.kp{user-select:none}.kq> svg{pointer-events:none}.kz{cursor:progress}.la{margin-left:4px}.lb{margin-top:0px}.lc{opacity:1}.ld{padding:4px 0}.lg{width:16px}.li{display:inline-flex}.lo{max-width:100%}.lp{padding:8px 2px}.lq svg{color:#6B6B6B}.mh{line-height:1.58}.mi{letter-spacing:-0.004em}.mj{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.ne{margin-bottom:-0.46em}.nf{text-decoration:underline}.nl{overflow-x:auto}.nm{font-family:source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace}.nn{padding:20px}.no{border-radius:0}.np{background:#F2F2F2}.nq{line-height:1.18}.nr{letter-spacing:-0.022em}.ns{margin-top:-0.09em}.nt{margin-bottom:-0.09em}.nu{white-space:pre-wrap}.nv{min-width:fit-content}.nw{font-style:italic}.nx{padding:2px 4px}.ny{font-size:75%}.nz> strong{font-family:inherit}.oa{box-shadow:inset 3px 0 0 0 #242424}.ob{padding-left:23px}.oc{margin-left:-20px}.od{margin-top:0.91em}.oe{list-style-type:decimal}.of{margin-left:30px}.og{padding-left:0px}.om{margin-top:32px}.on{margin-bottom:14px}.oo{padding-top:24px}.op{padding-bottom:10px}.oq{background-color:#000000}.or{height:3px}.os{width:3px}.ot{margin-right:20px}.ou{margin-bottom:26px}.ov{margin-top:6px}.ow{margin-top:8px}.ox{margin-right:8px}.oy{padding:8px 16px}.oz{border-radius:100px}.pa{transition:background 300ms ease}.pc{white-space:nowrap}.pd{border-top:none}.pe{height:52px}.pf{max-height:52px}.pg{box-sizing:content-box}.ph{position:static}.pi{z-index:1}.pk{max-width:155px}.pv{height:0px}.pw{margin-bottom:40px}.ql{height:64px}.qm{width:64px}.qn{align-self:flex-end}.qo{color:rgba(255, 255, 255, 1)}.qp{fill:rgba(255, 255, 255, 1)}.qq{background:rgba(25, 25, 25, 1)}.qr{border-color:rgba(25, 25, 25, 1)}.qu:disabled{opacity:0.1}.qv:disabled:hover{background:rgba(25, 25, 25, 1)}.qw:disabled:hover{border-color:rgba(25, 25, 25, 1)}.qx{flex:1 1 auto}.rd{padding-right:4px}.re{font-weight:500}.rr{margin-top:16px}.sp{gap:18px}.sq{fill:rgba(61, 61, 61, 1)}.ss{fill:#242424}.st{background:0}.su{border-color:#242424}.sv:disabled:hover{color:#242424}.sw:disabled:hover{fill:#242424}.sx:disabled:hover{border-color:#242424}.ti{border-bottom:solid 1px #E5E5E5}.tj{margin-top:72px}.tk{padding:24px 0}.tl{margin-bottom:0px}.tm{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:#156D12}.eu:hover{border-color:#156D12}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.il:hover{text-decoration:underline}.iq:hover:not(:disabled){color:#156D12}.ir:hover:not(:disabled){fill:#156D12}.kn:hover{fill:rgba(8, 8, 8, 1)}.le:hover{fill:#000000}.lf:hover p{color:#000000}.lh:hover{color:#000000}.lr:hover svg{color:#000000}.pb:hover{background-color:#F2F2F2}.qk:hover{background-color:none}.qs:hover{background:#000000}.qt:hover{border-color:#242424}.sr:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.km:focus{fill:rgba(8, 8, 8, 1)}.ls:focus svg{color:#000000}.kr:active{border-style:none}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:68px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.jk{border-top:solid 1px #F2F2F2}.jl{border-bottom:solid 1px #F2F2F2}.jm{margin:32px 0 0}.jn{padding:3px 8px}.jw> *{margin-right:24px}.jx> :last-child{margin-right:0}.ky{margin-top:0px}.ln{margin:0}.na{font-size:20px}.nb{margin-top:2.14em}.nc{line-height:32px}.nd{letter-spacing:-0.003em}.nk{margin-top:56px}.ol{margin-top:1.14em}.pp{display:inline-block}.pu{margin-bottom:104px}.px{flex-direction:row}.qa{margin-bottom:0}.qb{margin-right:20px}.qy{max-width:500px}.rp{line-height:24px}.rq{letter-spacing:0}.rw{margin-bottom:88px}.rz{margin-bottom:72px}.sm{font-size:24px}.sn{line-height:30px}.so{letter-spacing:-0.016em}.tc{width:min-width}.th{padding-top:72px}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.kx{margin-top:0px}.po{display:inline-block}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.kw{margin-top:0px}.pn{display:inline-block}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.ku{margin-top:0px}.kv{margin-right:0px}.pm{display:inline-block}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:4px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.it{flex-direction:column}.iy{margin:24px -24px 0}.iz{padding:0}.jo> *{margin-right:8px}.jp> :last-child{margin-right:24px}.kh{margin-left:0px}.ks{margin-top:0px}.kt{margin-right:0px}.lj{margin:0}.lt{border:1px solid #F2F2F2}.lu{border-radius:99em}.lv{padding:0px 16px 0px 12px}.lw{height:38px}.lx{align-items:center}.lz svg{margin-right:8px}.mk{font-size:18px}.ml{margin-top:1.56em}.mm{line-height:28px}.mn{letter-spacing:-0.003em}.ng{margin-top:40px}.oh{margin-top:1.34em}.pl{display:inline-block}.pq{margin-bottom:96px}.qi{margin-bottom:20px}.qj{margin-right:0}.rc{max-width:100%}.rf{font-size:24px}.rg{line-height:30px}.rh{letter-spacing:-0.016em}.rs{margin-bottom:64px}.sa{font-size:20px}.sb{line-height:24px}.sc{letter-spacing:0}.sy{width:100%}.td{padding-top:48px}.ly:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:68px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jg{border-top:solid 1px #F2F2F2}.jh{border-bottom:solid 1px #F2F2F2}.ji{margin:32px 0 0}.jj{padding:3px 8px}.ju> *{margin-right:24px}.jv> :last-child{margin-right:0}.lm{margin:0}.mw{font-size:20px}.mx{margin-top:2.14em}.my{line-height:32px}.mz{letter-spacing:-0.003em}.nj{margin-top:56px}.ok{margin-top:1.14em}.pt{margin-bottom:104px}.py{flex-direction:row}.qc{margin-bottom:0}.qd{margin-right:20px}.qz{max-width:500px}.rn{line-height:24px}.ro{letter-spacing:0}.rv{margin-bottom:88px}.ry{margin-bottom:72px}.sj{font-size:24px}.sk{line-height:30px}.sl{letter-spacing:-0.016em}.tb{width:min-width}.tg{padding-top:72px}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:68px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jc{border-top:solid 1px #F2F2F2}.jd{border-bottom:solid 1px #F2F2F2}.je{margin:32px 0 0}.jf{padding:3px 8px}.js> *{margin-right:24px}.jt> :last-child{margin-right:0}.ll{margin:0}.ms{font-size:20px}.mt{margin-top:2.14em}.mu{line-height:32px}.mv{letter-spacing:-0.003em}.ni{margin-top:56px}.oj{margin-top:1.14em}.ps{margin-bottom:104px}.pz{flex-direction:row}.qe{margin-bottom:0}.qf{margin-right:20px}.ra{max-width:500px}.rl{line-height:24px}.rm{letter-spacing:0}.ru{margin-bottom:88px}.rx{margin-bottom:72px}.sg{font-size:24px}.sh{line-height:30px}.si{letter-spacing:-0.016em}.ta{width:min-width}.tf{padding-top:72px}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:4px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iu{flex-direction:column}.ja{margin:24px 0 0}.jb{padding:0}.jq> *{margin-right:8px}.jr> :last-child{margin-right:8px}.ki{margin-left:0px}.lk{margin:0}.ma{border:1px solid #F2F2F2}.mb{border-radius:99em}.mc{padding:0px 16px 0px 12px}.md{height:38px}.me{align-items:center}.mg svg{margin-right:8px}.mo{font-size:18px}.mp{margin-top:1.56em}.mq{line-height:28px}.mr{letter-spacing:-0.003em}.nh{margin-top:40px}.oi{margin-top:1.34em}.pr{margin-bottom:96px}.qg{margin-bottom:20px}.qh{margin-right:0}.rb{max-width:100%}.ri{font-size:24px}.rj{line-height:30px}.rk{letter-spacing:-0.016em}.rt{margin-bottom:64px}.sd{font-size:20px}.se{line-height:24px}.sf{letter-spacing:0}.sz{width:100%}.te{padding-top:48px}.mf:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="532" data-fela-type="RULE" media="print">.pj{display:none}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F17c2c47d26f2&%7Efeature=LoOpenInAppButton&%7Echannel=ShowPostUnderUser&source=---top_nav_layout_nav----------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" href="https://medium.com/m/signin?operation=login&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&source=post_page---top_nav_layout_nav-----------------------global_nav-----------" rel="noopener follow">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" href="https://medium.com/?source=---top_nav_layout_nav----------------------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" href="https://medium.com/m/signin?operation=register&redirect=https%3A%2F%2Fmedium.com%2Fnew-story&source=---top_nav_layout_nav-----------------------new_post_topnav-----------" rel="noopener follow"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" href="https://medium.com/search?source=---top_nav_layout_nav----------------------------------" rel="noopener follow"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" href="https://medium.com/m/signin?operation=login&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&source=post_page---top_nav_layout_nav-----------------------global_nav-----------" rel="noopener follow">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="218d" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">Parse ISO 8601 String With Timezone Offset To Date Object In Groovy</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/?source=post_page---byline--17c2c47d26f2--------------------------------"><div class="l ib ic by id ie"><div class="l fj"><img alt="LoopedNetwork" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/1*nN7gyL6A1BkDdpAU96WUhw.png" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="ih ab q"><div class="ab q ii"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b ij ik bk"><a class="af ag ah ai aj ak al am an ao ap aq ar il" data-testid="authorName" rel="noopener follow" href="/?source=post_page---byline--17c2c47d26f2--------------------------------">LoopedNetwork</a></p></div></div></div><span class="im in" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b ij ik du"><span><a class="io ip ah ai aj ak al am an ao ap aq ar ex iq ir" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F8cad5d42225b&operation=register&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&user=LoopedNetwork&userId=8cad5d42225b&source=post_page-8cad5d42225b--byline--17c2c47d26f2---------------------post_header-----------" rel="noopener follow">Follow</a></span></p></div></div></span></div></div><div class="l is"><span class="bf b bg z du"><div class="ab cn it iu iv"><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">4 min read</span><div class="iw ix l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Jan 18, 2021</span></div></span></div></span></div></div></div><div class="ab cp iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn"><div class="h k w fg fh q"><div class="kd l"><div class="ab q ke kf"><div class="pw-multi-vote-icon fj kg kh ki kj"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fp%2F17c2c47d26f2&operation=register&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&user=LoopedNetwork&userId=8cad5d42225b&source=---header_actions--17c2c47d26f2---------------------clap_footer-----------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="kk ao kl km kn ko am kp kq kr kj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ks kt ku kv kw kx ky"><p class="bf b dv z du"><span class="kz">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao kk lc ld ab q fk le lf" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lb"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b dv z du"><span class="pw-responses-count la lb">1</span></p></button></div></div></div><div class="ab q jo jp jq jr js jt ju jv jw jx jy jz ka kb kc"><div class="lg k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F17c2c47d26f2&operation=register&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&source=---header_actions--17c2c47d26f2---------------------bookmark_footer-----------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lh" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd li cn"><div class="l ae"><div class="ab cb"><div class="lj lk ll lm ln lo ci bh"><div class="ab"><div class="bm bh" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al lp an ao ap ex lq lr lf ls lt lu lv lw s lx ly lz ma mb mc md u me mf mg"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al lp an ao ap ex lq lr lf ls lt lu lv lw s lx ly lz ma mb mc md u me mf mg"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><p id="3df1" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">My <a class="af nf" href="https://looped.network/groovy-programming-creating-an-iso-date-at-a-specific-date-and-time-in-utc/" rel="noopener ugc nofollow" target="_blank">Groovy posts always have the absolute worst titles</a>, but I figure that making them verbose is really the only way to make them discoverable. I write a good bit of Groovy code at work, and given that it’s been a few years since the heyday of Groovy it can occasionally be a bit of a struggle to figure out exactly what I need with the resources I dig up online. Any time I manage to figure out something that was difficult to find information on, it seems like a good opportunity to fill the gap a bit.</p><p id="fa91" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">I do a lot of work with APIs, mostly making calls against cloud-based systems. In the cloud, no one generally cares about what timezone you happen to be in, so UTC is always used. I’ve recently been making calls against local software platform, though, and <strong class="mj gv">it</strong> returns timestamps in the local time of the server running it. Ick. I ended up with string values like the following which I then needed to parse as a Date object in Groovy for the sake of comparison.</p><pre class="ng nh ni nj nk nl nm nn no ay np bk"><span id="0090" class="nq nr gu nm b ij ns nt l nu nv">"2020-10-17T02:00:21.644-04:00"</span></pre><p id="3b13" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">I’m quite familiar with converting something like this <em class="nw">without</em> the timezone offset at the end; that one was new for me. My first struggle was exactly what to search for in order to dig up information on this; I eventually discovered that this is <a class="af nf" href="https://www.iso.org/iso-8601-date-and-time-format.html" rel="noopener ugc nofollow" target="_blank">an ISO 8601 date and time format</a>. I first attempted to simply pass this value straight to <code class="cx nx ny nz nm b">Date.parse()</code> like I would with something in UTC:</p><pre class="ng nh ni nj nk nl nm nn no ay np bk"><span id="7a78" class="nq nr gu nm b ij ns nt l nu nv">def dateString = "2020-10-17T02:00:21.644-04:00"<br/>def dateObject = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSSZ", dateString)</span></pre><p id="7e81" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">Attempting this gives a really nice error message:</p><blockquote class="oa ob oc"><p id="6804" class="mh mi nw mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk"><em class="gu">Unparseable date: “2020–10–17T02:00:21.644–04:00”</em></p></blockquote><p id="bccc" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">After more digging than I care to admit, I finally got to the root of the problem: Groovy doesn’t like the colon in the timezone offset. Rather than <code class="cx nx ny nz nm b">04:00</code> it wants <code class="cx nx ny nz nm b">0400</code>. Given that I work in the western hemisphere, I <em class="nw">could</em> have taken the easy route and simply removed the last 3 characters, replacing <code class="cx nx ny nz nm b">:00</code> with <code class="cx nx ny nz nm b">00</code>. It's not the most elegant solution, though, and there are parts of the world with timezone offsets in fractions of an hour; assuming it's always going to be a whole hour isn't safe. My first take, written last week, was to be extremely complicated by splitting the string into a list at each colon. From there, I concatenated the list items back into a string, separating them with colons, until attaching the very last piece, which is added sans colon:</p><pre class="ng nh ni nj nk nl nm nn no ay np bk"><span id="9286" class="nq nr gu nm b ij ns nt l nu nv">def originalString = "2020-10-17T02:00:21.644-04:00"<br/>def stringList = originalString.split(":")<br/>def listLen = stringList.size()<br/>def newDateString = ""<br/>def dateCounter = 0<br/>stringList.each { datePiece -><br/> dateCounter++<br/> if ( dateCounter == 1 ) {<br/> newDateString = datePiece<br/> } else if ( dateCounter < listLen ) { <br/> newDateString += ":" + datePiece<br/> } else {<br/> newDateString += datePiece<br/> }<br/>}</span><span id="d760" class="nq nr gu nm b ij od nt l nu nv">def dateObject = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSSZ", newDateString)<br/>println dateObject</span></pre><p id="d842" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">It technically works but doesn’t look so good; no one would ever call the above solution “elegant” by any stretch. That was done late on a Friday, though, and over the weekend I had a better thought pop into my head. What if instead of spitting up the entire string I simply:</p><ol class=""><li id="539a" class="mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne oe of og bk">Verified first that the end of the string matched what was expected.</li><li id="285b" class="mh mi gu mj b mk oh mm mn mo oi mq mr ms oj mu mv mw ok my mz na ol nc nd ne oe of og bk">Took a substring that was everything up until the problematic part of the offset.</li><li id="9080" class="mh mi gu mj b mk oh mm mn mo oi mq mr ms oj mu mv mw ok my mz na ol nc nd ne oe of og bk">Took a substring for the numbers after the last colon.</li><li id="dcee" class="mh mi gu mj b mk oh mm mn mo oi mq mr ms oj mu mv mw ok my mz na ol nc nd ne oe of og bk">Put the parts from 2 and 3 together.</li></ol><p id="07f8" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">After shaking off a bit of regular expression rust, this is what I ended up using:</p><pre class="ng nh ni nj nk nl nm nn no ay np bk"><span id="f333" class="nq nr gu nm b ij ns nt l nu nv">def createdAt = "2020-10-17T02:00:21.644-04:00"</span><span id="45ed" class="nq nr gu nm b ij od nt l nu nv">if ( createdAt =~ /:\d{2}$/ ) {<br/> println "It's a match."<br/> def fixedDate = createdAt.substring(0, createdAt.length() - 3)<br/> fixedDate += createdAt.substring(createdAt.length() - 2)<br/> def dateObject = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSSZ", fixedDate)<br/> println dateObject<br/>} else {<br/> println "No match!"<br/>}</span></pre><p id="d46b" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">The partial regex match of <code class="cx nx ny nz nm b">:\d{2}$</code> validates that the string ends with a colon followed by any 2 digits. If so, I first create a substring from the first index (0) up to the index at the length of the string minus 3, meaning I omit the colon and last 2 numbers. Then I append to that a substring from the overall string's length minus <strong class="mj gv">2</strong> through the end of the string. Using the overall string's length minus 2 rather than 3 means I just leave out the colon.</p><p id="a661" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk">Is this the best solution? Probably not, but it’s getting the job done in my situation. If I ran into issues, my next attempt would be to get the index of every colon in the entire string and then replace the very last one with nothing.</p></div></div></div><div class="ab cb om on oo op" role="separator"><span class="oq by bm or os ot"></span><span class="oq by bm or os ot"></span><span class="oq by bm or os"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><p id="839c" class="pw-post-body-paragraph mh mi gu mj b mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne gn bk"><em class="nw">Originally published at </em><a class="af nf" href="https://looped.network/parse-iso-8601-string-with-timezone-offset-to-string-in-groovy/" rel="noopener ugc nofollow" target="_blank"><em class="nw">https://looped.network</em></a><em class="nw"> on January 18, 2021.</em></p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ou ov ab iv"><div class="ow ab"><a class="ox ay am ao" href="https://medium.com/tag/groovy?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><div class="oy fj cx oz ge pa pb bf b bg z bk pc">Groovy</div></a></div><div class="ow ab"><a class="ox ay am ao" href="https://medium.com/tag/programming?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><div class="oy fj cx oz ge pa pb bf b bg z bk pc">Programming</div></a></div><div class="ow ab"><a class="ox ay am ao" href="https://medium.com/tag/scripting?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><div class="oy fj cx oz ge pa pb bf b bg z bk pc">Scripting</div></a></div><div class="ow ab"><a class="ox ay am ao" href="https://medium.com/tag/iso-8601?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><div class="oy fj cx oz ge pa pb bf b bg z bk pc">Iso 8601</div></a></div><div class="ow ab"><a class="ox ay am ao" href="https://medium.com/tag/datetime?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><div class="oy fj cx oz ge pa pb bf b bg z bk pc">Datetime</div></a></div></div></div></div><div class="l"></div><footer class="pd on pe pf pg ab q ph pi c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp pj"><div class="ab q ke"><div class="pk l"><span class="l pl pm pn e d"><div class="ab q ke kf"><div class="pw-multi-vote-icon fj kg kh ki kj"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fp%2F17c2c47d26f2&operation=register&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&user=LoopedNetwork&userId=8cad5d42225b&source=---footer_actions--17c2c47d26f2---------------------clap_footer-----------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="kk ao kl km kn ko am kp kq kr kj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ks kt ku kv kw kx ky"><p class="bf b dv z du"><span class="kz">--</span></p></div></div></span><span class="l h g f po pp"><div class="ab q ke kf"><div class="pw-multi-vote-icon fj kg kh ki kj"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fp%2F17c2c47d26f2&operation=register&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&user=LoopedNetwork&userId=8cad5d42225b&source=---footer_actions--17c2c47d26f2---------------------clap_footer-----------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="kk ao kl km kn ko am kp kq kr kj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ks kt ku kv kw kx ky"><p class="bf b dv z du"><span class="kz">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao kk lc ld ab q fk le lf" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lb"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b bg z du"><span class="pw-responses-count la lb">1</span></p></button></div></div></div></div><div class="ab q"><div class="ot l is"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F17c2c47d26f2&operation=register&redirect=https%3A%2F%2Floopednetwork.medium.com%2Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2&source=---footer_actions--17c2c47d26f2---------------------bookmark_footer-----------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lh" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="ot l is"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al lp an ao ap ex lq lr lf ls"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="pq pr ps pt pu l"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="pv bh r pw"></div><div class="ab px py pz iu it"><div class="qa qb qc qd qe qf qg qh qi qj ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/?source=post_page---post_author_info--17c2c47d26f2--------------------------------"><div class="l fj"><img alt="LoopedNetwork" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*nN7gyL6A1BkDdpAU96WUhw.png" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay qk"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/?source=post_page---post_author_info--17c2c47d26f2--------------------------------"><div class="l fj"><img alt="LoopedNetwork" class="l fd by ql qm cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*nN7gyL6A1BkDdpAU96WUhw.png" width="64" height="64" loading="lazy"/><div class="fr by l ql qm fs n ay qk"></div></div></a></div><div class="j i d qn is"><div class="ab"><span><button class="bf b bg z qo oy qp qq qr qs qt ev ew qu qv qw fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co qx"><div class="qy qz ra rb rc l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/?source=post_page---post_author_info--17c2c47d26f2--------------------------------"><h2 class="pw-author-name bf re rf rg rh ri rj rk ms rl rm mw rn ro na rp rq bk"><span class="gn rd">Written by <!-- -->LoopedNetwork</span></h2></a><div class="ow ab ia"><div class="l is"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar il" rel="noopener follow" href="/followers?source=post_page---post_author_info--17c2c47d26f2--------------------------------">29 Followers</a></span></div><div class="bf b bg z du ab nu"><span class="im l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar il" rel="noopener follow" href="/following?source=post_page---post_author_info--17c2c47d26f2--------------------------------">7 Following</a></div></div><div class="rr l"><p class="bf b bg z bk"><span class="gn">The /dev/null of my life.</span></p></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z qo oy qp qq qr qs qt ev ew qu qv qw fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div><div class="rs rt ru rv rw l"><div class="pv bh r rs rt rx ry rz"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf re sa sb sc sd se sf sg sh si sj sk sl sm sn so bk">Responses (<!-- -->1<!-- -->)</h2><div class="ab sp"><div><div class="bm" aria-hidden="false"><a class="sq sr" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--17c2c47d26f2--------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div><div class="om l"><button class="bf b bg z bk oy ss st su lh le qt ev ew ex sv sw sx fa sy sz ta tb tc fb fc fd bm fe ff">See all responses</button></div></div></div></div><div class="td te tf tg th l bx"><div class="h k j"><div class="pv bh ti tj"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="tk ab ke iv"><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/about?autoplay=1&source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">About</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Careers</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="pressinquiries@medium.com?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="tl tm l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="tl l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/business?source=post_page-----17c2c47d26f2--------------------------------" rel="noopener follow"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20241211-002712-06eeb755b9"</script><script>window.__GRAPHQL_URI__ = "https://loopednetwork.medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-17c2c47d26f2","user-8cad5d42225b"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"lohpSummerUpsellEnabled":false,"postBottomResponsesEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"USER","id":"8cad5d42225b","explicit":true},"viewerIsBot":false},"debug":{"requestId":"04c04987-5462-4967-9034-f306a424dce3","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-8c6879facb6c94d01255bb65f898489f-97a603a4c2ef421d-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Floopednetwork.medium.com\u002Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2","host":"loopednetwork.medium.com","hostname":"loopednetwork.medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20241211-002712-06eeb755b9","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20241211-002712-06eeb755b9","commit":"06eeb755b9a15ce5f0f591ac40954b48c5d9b302"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"collectionByDomainOrSlug({\"domainOrSlug\":\"loopednetwork.medium.com\"})":null,"postResult({\"id\":\"17c2c47d26f2\"})":{"__ref":"Post:17c2c47d26f2"}},"LinkedAccounts:8cad5d42225b":{"__typename":"LinkedAccounts","mastodon":null,"id":"8cad5d42225b"},"User:8cad5d42225b":{"__typename":"User","id":"8cad5d42225b","linkedAccounts":{"__ref":"LinkedAccounts:8cad5d42225b"},"isSuspended":false,"name":"LoopedNetwork","imageId":"1*nN7gyL6A1BkDdpAU96WUhw.png","customDomainState":{"__typename":"CustomDomainState","live":{"__typename":"CustomDomain","domain":"loopednetwork.medium.com"}},"hasSubdomain":true,"username":"loopednetwork","verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":29,"followingCount":7,"collectionFollowingCount":0},"bio":"The \u002Fdev\u002Fnull of my life.","membership":null,"allowNotes":true,"viewerEdge":{"__ref":"UserViewerEdge:userId:8cad5d42225b-viewerId:lo_cd7ab5cc5ef4"},"twitterScreenName":""},"Paragraph:21cd6aaa2575_0":{"__typename":"Paragraph","id":"21cd6aaa2575_0","name":"218d","type":"H3","href":null,"layout":null,"metadata":null,"text":"Parse ISO 8601 String With Timezone Offset To Date Object In Groovy","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_1":{"__typename":"Paragraph","id":"21cd6aaa2575_1","name":"3df1","type":"P","href":null,"layout":null,"metadata":null,"text":"My Groovy posts always have the absolute worst titles, but I figure that making them verbose is really the only way to make them discoverable. I write a good bit of Groovy code at work, and given that it’s been a few years since the heyday of Groovy it can occasionally be a bit of a struggle to figure out exactly what I need with the resources I dig up online. Any time I manage to figure out something that was difficult to find information on, it seems like a good opportunity to fill the gap a bit.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":3,"end":53,"href":"https:\u002F\u002Flooped.network\u002Fgroovy-programming-creating-an-iso-date-at-a-specific-date-and-time-in-utc\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_2":{"__typename":"Paragraph","id":"21cd6aaa2575_2","name":"fa91","type":"P","href":null,"layout":null,"metadata":null,"text":"I do a lot of work with APIs, mostly making calls against cloud-based systems. In the cloud, no one generally cares about what timezone you happen to be in, so UTC is always used. I’ve recently been making calls against local software platform, though, and it returns timestamps in the local time of the server running it. Ick. I ended up with string values like the following which I then needed to parse as a Date object in Groovy for the sake of comparison.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":257,"end":259,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_3":{"__typename":"Paragraph","id":"21cd6aaa2575_3","name":"0090","type":"PRE","href":null,"layout":null,"metadata":null,"text":"\"2020-10-17T02:00:21.644-04:00\"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_4":{"__typename":"Paragraph","id":"21cd6aaa2575_4","name":"3b13","type":"P","href":null,"layout":null,"metadata":null,"text":"I’m quite familiar with converting something like this without the timezone offset at the end; that one was new for me. My first struggle was exactly what to search for in order to dig up information on this; I eventually discovered that this is an ISO 8601 date and time format. I first attempted to simply pass this value straight to Date.parse() like I would with something in UTC:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":336,"end":348,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":246,"end":278,"href":"https:\u002F\u002Fwww.iso.org\u002Fiso-8601-date-and-time-format.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":55,"end":62,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_5":{"__typename":"Paragraph","id":"21cd6aaa2575_5","name":"7a78","type":"PRE","href":null,"layout":null,"metadata":null,"text":"def dateString = \"2020-10-17T02:00:21.644-04:00\"\ndef dateObject = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", dateString)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_6":{"__typename":"Paragraph","id":"21cd6aaa2575_6","name":"7e81","type":"P","href":null,"layout":null,"metadata":null,"text":"Attempting this gives a really nice error message:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_7":{"__typename":"Paragraph","id":"21cd6aaa2575_7","name":"6804","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Unparseable date: “2020–10–17T02:00:21.644–04:00”","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":49,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_8":{"__typename":"Paragraph","id":"21cd6aaa2575_8","name":"bccc","type":"P","href":null,"layout":null,"metadata":null,"text":"After more digging than I care to admit, I finally got to the root of the problem: Groovy doesn’t like the colon in the timezone offset. Rather than 04:00 it wants 0400. Given that I work in the western hemisphere, I could have taken the easy route and simply removed the last 3 characters, replacing :00 with 00. It's not the most elegant solution, though, and there are parts of the world with timezone offsets in fractions of an hour; assuming it's always going to be a whole hour isn't safe. My first take, written last week, was to be extremely complicated by splitting the string into a list at each colon. From there, I concatenated the list items back into a string, separating them with colons, until attaching the very last piece, which is added sans colon:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":149,"end":154,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":164,"end":168,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":301,"end":304,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":310,"end":312,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":217,"end":222,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_9":{"__typename":"Paragraph","id":"21cd6aaa2575_9","name":"9286","type":"PRE","href":null,"layout":null,"metadata":null,"text":"def originalString = \"2020-10-17T02:00:21.644-04:00\"\ndef stringList = originalString.split(\":\")\ndef listLen = stringList.size()\ndef newDateString = \"\"\ndef dateCounter = 0\nstringList.each { datePiece -\u003E\n dateCounter++\n if ( dateCounter == 1 ) {\n newDateString = datePiece\n } else if ( dateCounter \u003C listLen ) { \n newDateString += \":\" + datePiece\n } else {\n newDateString += datePiece\n }\n}","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":0,"end":423,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_10":{"__typename":"Paragraph","id":"21cd6aaa2575_10","name":"d760","type":"PRE","href":null,"layout":null,"metadata":null,"text":"def dateObject = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", newDateString)\nprintln dateObject","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":0,"end":91,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_11":{"__typename":"Paragraph","id":"21cd6aaa2575_11","name":"d842","type":"P","href":null,"layout":null,"metadata":null,"text":"It technically works but doesn’t look so good; no one would ever call the above solution “elegant” by any stretch. That was done late on a Friday, though, and over the weekend I had a better thought pop into my head. What if instead of spitting up the entire string I simply:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_12":{"__typename":"Paragraph","id":"21cd6aaa2575_12","name":"539a","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Verified first that the end of the string matched what was expected.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_13":{"__typename":"Paragraph","id":"21cd6aaa2575_13","name":"285b","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Took a substring that was everything up until the problematic part of the offset.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_14":{"__typename":"Paragraph","id":"21cd6aaa2575_14","name":"9080","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Took a substring for the numbers after the last colon.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_15":{"__typename":"Paragraph","id":"21cd6aaa2575_15","name":"dcee","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Put the parts from 2 and 3 together.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_16":{"__typename":"Paragraph","id":"21cd6aaa2575_16","name":"07f8","type":"P","href":null,"layout":null,"metadata":null,"text":"After shaking off a bit of regular expression rust, this is what I ended up using:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_17":{"__typename":"Paragraph","id":"21cd6aaa2575_17","name":"f333","type":"PRE","href":null,"layout":null,"metadata":null,"text":"def createdAt = \"2020-10-17T02:00:21.644-04:00\"","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":0,"end":47,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_18":{"__typename":"Paragraph","id":"21cd6aaa2575_18","name":"45ed","type":"PRE","href":null,"layout":null,"metadata":null,"text":"if ( createdAt =~ \u002F:\\d{2}$\u002F ) {\n println \"It's a match.\"\n def fixedDate = createdAt.substring(0, createdAt.length() - 3)\n fixedDate += createdAt.substring(createdAt.length() - 2)\n def dateObject = Date.parse(\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", fixedDate)\n println dateObject\n} else {\n println \"No match!\"\n}","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":0,"end":318,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_19":{"__typename":"Paragraph","id":"21cd6aaa2575_19","name":"d46b","type":"P","href":null,"layout":null,"metadata":null,"text":"The partial regex match of :\\d{2}$ validates that the string ends with a colon followed by any 2 digits. If so, I first create a substring from the first index (0) up to the index at the length of the string minus 3, meaning I omit the colon and last 2 numbers. Then I append to that a substring from the overall string's length minus 2 through the end of the string. Using the overall string's length minus 2 rather than 3 means I just leave out the colon.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":27,"end":34,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":335,"end":336,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_20":{"__typename":"Paragraph","id":"21cd6aaa2575_20","name":"a661","type":"P","href":null,"layout":null,"metadata":null,"text":"Is this the best solution? Probably not, but it’s getting the job done in my situation. If I ran into issues, my next attempt would be to get the index of every colon in the entire string and then replace the very last one with nothing.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:21cd6aaa2575_21":{"__typename":"Paragraph","id":"21cd6aaa2575_21","name":"839c","type":"P","href":null,"layout":null,"metadata":null,"text":"Originally published at https:\u002F\u002Flooped.network on January 18, 2021.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":24,"end":46,"href":"https:\u002F\u002Flooped.network\u002Fparse-iso-8601-string-with-timezone-offset-to-string-in-groovy\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":67,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"UserViewerEdge:userId:8cad5d42225b-viewerId:lo_cd7ab5cc5ef4":{"__typename":"UserViewerEdge","id":"userId:8cad5d42225b-viewerId:lo_cd7ab5cc5ef4","isMuting":false},"ImageMetadata:":{"__typename":"ImageMetadata","id":"","alt":null,"focusPercentX":null,"focusPercentY":null,"originalHeight":null,"originalWidth":null},"PostViewerEdge:postId:17c2c47d26f2-viewerId:lo_cd7ab5cc5ef4":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:17c2c47d26f2-viewerId:lo_cd7ab5cc5ef4"},"Tag:groovy":{"__typename":"Tag","id":"groovy","displayTitle":"Groovy","normalizedTagSlug":"groovy"},"Tag:programming":{"__typename":"Tag","id":"programming","displayTitle":"Programming","normalizedTagSlug":"programming"},"Tag:scripting":{"__typename":"Tag","id":"scripting","displayTitle":"Scripting","normalizedTagSlug":"scripting"},"Tag:iso-8601":{"__typename":"Tag","id":"iso-8601","displayTitle":"Iso 8601","normalizedTagSlug":"iso8601"},"Tag:datetime":{"__typename":"Tag","id":"datetime","displayTitle":"Datetime","normalizedTagSlug":"datetime"},"Post:17c2c47d26f2":{"__typename":"Post","id":"17c2c47d26f2","collection":null,"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"6442","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"c754","startIndex":21,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:21cd6aaa2575_0"},{"__ref":"Paragraph:21cd6aaa2575_1"},{"__ref":"Paragraph:21cd6aaa2575_2"},{"__ref":"Paragraph:21cd6aaa2575_3"},{"__ref":"Paragraph:21cd6aaa2575_4"},{"__ref":"Paragraph:21cd6aaa2575_5"},{"__ref":"Paragraph:21cd6aaa2575_6"},{"__ref":"Paragraph:21cd6aaa2575_7"},{"__ref":"Paragraph:21cd6aaa2575_8"},{"__ref":"Paragraph:21cd6aaa2575_9"},{"__ref":"Paragraph:21cd6aaa2575_10"},{"__ref":"Paragraph:21cd6aaa2575_11"},{"__ref":"Paragraph:21cd6aaa2575_12"},{"__ref":"Paragraph:21cd6aaa2575_13"},{"__ref":"Paragraph:21cd6aaa2575_14"},{"__ref":"Paragraph:21cd6aaa2575_15"},{"__ref":"Paragraph:21cd6aaa2575_16"},{"__ref":"Paragraph:21cd6aaa2575_17"},{"__ref":"Paragraph:21cd6aaa2575_18"},{"__ref":"Paragraph:21cd6aaa2575_19"},{"__ref":"Paragraph:21cd6aaa2575_20"},{"__ref":"Paragraph:21cd6aaa2575_21"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:8cad5d42225b"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Floopednetwork.medium.com\u002Fparse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2","primaryTopic":null,"topics":[],"isPublished":true,"latestPublishedVersion":"21cd6aaa2575","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":1},"clapCount":0,"allowResponses":true,"isLimitedState":false,"title":"Parse ISO 8601 String With Timezone Offset To Date Object In Groovy","isSeries":false,"sequence":null,"uniqueSlug":"parse-iso-8601-string-with-timezone-offset-to-date-object-in-groovy-17c2c47d26f2","socialTitle":"","socialDek":"","canonicalUrl":"https:\u002F\u002Flooped.network\u002Fparse-iso-8601-string-with-timezone-offset-to-string-in-groovy\u002F","metaDescription":"","latestPublishedAt":1641134125572,"readingTime":3.0150943396226415,"previewContent":{"__typename":"PreviewContent","subtitle":"My Groovy posts always have the absolute worst titles, but I figure that making them verbose is really the only way to make them…"},"previewImage":{"__ref":"ImageMetadata:"},"isShortform":false,"seoTitle":"","firstPublishedAt":1611013935000,"updatedAt":1641134132328,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:17c2c47d26f2-viewerId:lo_cd7ab5cc5ef4"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:groovy"},{"__ref":"Tag:programming"},{"__ref":"Tag:scripting"},{"__ref":"Tag:iso-8601"},{"__ref":"Tag:datetime"}],"isNewsletter":false,"statusForCollection":null,"pendingCollection":null,"detectedLanguage":"en","wordCount":799,"layerCake":0,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"MISS"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.e7f50217.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.44bae5c3.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4810.6318add7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.b0942613.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.24215cba.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.a99358a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5250.9f9e01d2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5113.946df777.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.b071a958.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.826a25fb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5266.4bb3cbe9.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6589.2f0f39c0.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.d8ead0e7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.cd03f950.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.08de95de.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2420.2a5e2d95.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.ca7937c2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.d195c6f1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7394.bf599bc5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5794.1d6ee184.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.c4082863.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.88c9be7a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.6565ad5f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.a0afad8a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.36c2ecf4.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8f042b7dba74fd31',t:'MTczMzkwNjQyNy4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>