...
 
Commits (3)
    https://gitcode.net/duanluan/ZUtil/-/commit/023879e1693ac799252fe75289bd48c2b2f69d50 Deploy website - based on aa5819a7e0cd3ed17e14e7974c1da63070545fb0 2023-05-08T01:08:49+08:00 duanluan duanluan@outlook.com https://gitcode.net/duanluan/ZUtil/-/commit/a655844679c45a52f8453b97c04590c9bed6eb44 deploy: aa5819a7e0cd3ed17e14e7974c1da63070545fb0 2023-05-07T17:09:46+00:00 duanluan duanluan@outlook.com https://gitcode.net/duanluan/ZUtil/-/commit/c35a7947b3d95e4d6b297a58b8364bfc91ba656a Deploy website - based on aa5819a7e0cd3ed17e14e7974c1da63070545fb0 2023-05-08T01:20:11+08:00 duanluan duanluan@outlook.com
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="plugin-native plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">找不到页面 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/404.html"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="找不到页面 | ZUtil"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/404.html"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/404.html" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/404.html" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">找不到页面</h1><p>我们找不到您要找的页面。</p><p>请联系原始链接来源网站的所有者,并告知他们链接已损坏。</p></div></div></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 256 256"><g><g><polygon points="79.093,0 48.907,30.187 146.72,128 48.907,225.813 79.093,256 207.093,128"/></g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></svg>');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" viewBox="0 0 24 24"><path fill="rgba(0,0,0,0.5)" d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"></path></svg>');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="16px" width="16px"><path d="M6.02945,10.20327a4.17382,4.17382,0,1,1,4.17382-4.17382A4.15609,4.15609,0,0,1,6.02945,10.20327Zm9.69195,4.2199L10.8989,9.59979A5.88021,5.88021,0,0,0,12.058,6.02856,6.00467,6.00467,0,1,0,9.59979,10.8989l4.82338,4.82338a.89729.89729,0,0,0,1.29912,0,.89749.89749,0,0,0-.00087-1.29909Z" /></svg>');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.header-github-link{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");display:flex;height:24px;width:24px}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.features_t9lD{align-items:center;display:flex;padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}}
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[13],{9058:(e,t,a)=>{a.d(t,{Z:()=>_});var l=a(7294),n=a(6010),r=a(7961),s=a(7524),c=a(9960),i=a(5999);const m="sidebar_re4s",o="sidebarItemTitle_pO2u",u="sidebarItemList_Yudw",g="sidebarItem__DBe",d="sidebarItemLink_mo7H",E="sidebarItemLinkActive_I1ZP";function b(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(m,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(o,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(u,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:g},l.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:d,activeClassName:E},e.title)))))))}var p=a(3102);function h(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function k(e){return l.createElement(p.Zo,{component:h,props:e})}function N(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(k,{sidebar:t}):l.createElement(b,{sidebar:t}):null}function _(e){const{sidebar:t,toc:a,children:s,...c}=e,i=t&&t.items.length>0;return l.createElement(r.Z,c,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(N,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},1223:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var l=a(7294),n=a(6010),r=a(5999);var s=a(1944),c=a(5281),i=a(9058),m=a(3008);const o="tag_Nnez";function u(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:o},l.createElement(m.Z,e))))),l.createElement("hr",null))}function g(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(u,{key:e.letter,letterEntry:e}))))}var d=a(197);function E(e){let{tags:t,sidebar:a}=e;const m=(0,r.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});return l.createElement(s.FG,{className:(0,n.Z)(c.k.wrapper.blogPages,c.k.page.blogTagsListPage)},l.createElement(s.d,{title:m}),l.createElement(d.Z,{tag:"blog_tags_list"}),l.createElement(i.Z,{sidebar:a},l.createElement("h1",null,m),l.createElement(g,{tags:t})))}},3008:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(6010),r=a(9960);const s="tag_zVej",c="tagRegular_sFm0",i="tagWithCount_h2kH";function m(e){let{permalink:t,label:a,count:m}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(s,m?i:c)},a,m&&l.createElement("span",null,m))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[562],{7372:l=>{l.exports=JSON.parse('{"label":"zone","permalink":"/ZUtil/blog/tags/zone","allTagsPath":"/ZUtil/blog/tags","count":1}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[663],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(r),f=a,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||o;return r?n.createElement(m,c(c({ref:t},u),{},{components:r})):n.createElement(m,c({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,c=new Array(o);c[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,c[1]=i;for(var s=2;s<o;s++)c[s]=r[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},6362:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const o={},c="constant \u5e38\u91cf",i={unversionedId:"reference-doc/date/constant",id:"reference-doc/date/constant",title:"constant \u5e38\u91cf",description:"DateConstant - \u65f6\u95f4\u5e38\u91cf",source:"@site/docs/003-reference-doc/date/001-constant.md",sourceDirName:"003-reference-doc/date",slug:"/reference-doc/date/constant",permalink:"/ZUtil/docs/reference-doc/date/constant",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/date/001-constant.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"date \u65f6\u95f4",permalink:"/ZUtil/docs/category/date-\u65f6\u95f4"},next:{title:"DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b",permalink:"/ZUtil/docs/reference-doc/date/dateUtils"}},l={},s=[{value:"DateConstant - \u65f6\u95f4\u5e38\u91cf",id:"dateconstant---\u65f6\u95f4\u5e38\u91cf",level:2},{value:"DateDuration - \u6301\u7eed\u65f6\u95f4",id:"dateduration---\u6301\u7eed\u65f6\u95f4",level:2},{value:"\u5176\u4ed6",id:"\u5176\u4ed6",level:2}],u={toc:s};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"constant-\u5e38\u91cf"},"constant \u5e38\u91cf"),(0,a.kt)("h2",{id:"dateconstant---\u65f6\u95f4\u5e38\u91cf"},"DateConstant - \u65f6\u95f4\u5e38\u91cf"),(0,a.kt)("p",null,"\u65f6\u95f4\u5de5\u5177\u7c7b\u9ed8\u8ba4\u503c\u3002"),(0,a.kt)("p",null,"\u5982\u9700\u4fee\u6539\uff0c\u89c1 ",(0,a.kt)("a",{parentName:"p",href:"./dateFeature"},"DateFeature"),"\u3002"),(0,a.kt)("h2",{id:"dateduration---\u6301\u7eed\u65f6\u95f4"},"DateDuration - \u6301\u7eed\u65f6\u95f4"),(0,a.kt)("p",null,"\u661f\u671f\u3001\u5929\u3001\u5c0f\u65f6\u3001\u5206\u949f\u3001\u79d2\u7684\u6beb\u79d2\u6570\uff0c\u8fd8\u6709 1000 \u6beb\u79d2\u672c\u8eab\u3002"),(0,a.kt)("h2",{id:"\u5176\u4ed6"},"\u5176\u4ed6"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"DateFormat")," - FastDateFormat \u5bf9\u8c61"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"DateFormatter")," - DateTimeFormatter \u5bf9\u8c61"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"DatePattern")," - \u65f6\u95f4\u683c\u5f0f"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"DateRegexPattern")," - \u65f6\u95f4\u683c\u5f0f\u6b63\u5219")))}d.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[908],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),u=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},s="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),s=u(r),f=n,m=s["".concat(i,".").concat(f)]||s[f]||p[f]||o;return r?a.createElement(m,l(l({ref:t},d),{},{components:r})):a.createElement(m,l({ref:t},d))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=f;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[s]="string"==typeof e?e:n,l[1]=c;for(var u=2;u<o;u++)l[u]=r[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}f.displayName="MDXCreateElement"},6330:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var a=r(7462),n=(r(7294),r(3905));const o={},l="DateFeature \u65f6\u95f4\u7279\u6027",c={unversionedId:"reference-doc/date/dateFeature",id:"reference-doc/date/dateFeature",title:"DateFeature \u65f6\u95f4\u7279\u6027",description:"\u53ef\u4ee5\u901a\u8fc7\u4e34\u65f6\u6216\u603b\u662f\uff08Always\uff09\u4fee\u6539\u5176\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u6765\u51b3\u5b9a DateUtils \u4e2d\u65b9\u6cd5\u5bf9\u65f6\u95f4\u7684\u5904\u7406\u65b9\u5f0f\u3002",source:"@site/docs/003-reference-doc/date/003-dateFeature.md",sourceDirName:"003-reference-doc/date",slug:"/reference-doc/date/dateFeature",permalink:"/ZUtil/docs/reference-doc/date/dateFeature",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/date/003-dateFeature.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b",permalink:"/ZUtil/docs/reference-doc/date/dateUtils"},next:{title:"pinyin \u62fc\u97f3",permalink:"/ZUtil/docs/category/pinyin-\u62fc\u97f3"}},i={},u=[{value:"RESOLVER_STYLE - \u89e3\u6790\u5668\u6a21\u5f0f/\u98ce\u683c",id:"resolver_style---\u89e3\u6790\u5668\u6a21\u5f0f\u98ce\u683c",level:2},{value:"LOCALE - \u533a\u57df",id:"locale---\u533a\u57df",level:2},{value:"ZONE_ID - \u65f6\u533a/\u533a\u57df ID",id:"zone_id---\u65f6\u533a\u533a\u57df-id",level:2},{value:"MIN_DATE_YEAR - \u6700\u5c0f Date \u5e74",id:"min_date_year---\u6700\u5c0f-date-\u5e74",level:2}],d={toc:u};function s(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"datefeature-\u65f6\u95f4\u7279\u6027"},"DateFeature \u65f6\u95f4\u7279\u6027"),(0,n.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7\u4e34\u65f6\u6216\u603b\u662f\uff08Always\uff09\u4fee\u6539\u5176\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u6765\u51b3\u5b9a DateUtils \u4e2d\u65b9\u6cd5\u5bf9\u65f6\u95f4\u7684\u5904\u7406\u65b9\u5f0f\u3002"),(0,n.kt)("h2",{id:"resolver_style---\u89e3\u6790\u5668\u6a21\u5f0f\u98ce\u683c"},"RESOLVER_STYLE - \u89e3\u6790\u5668\u6a21\u5f0f/\u98ce\u683c"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"// \u4e34\u65f6\u8bbe\u7f6e\u89e3\u6790\u5668\u6a21\u5f0f\u4e3a\u5bbd\u5bb9\nDateFeature.set(ResolverStyle.LENIENT);\n// \u9ed8\u8ba4\u4e3a\u4e25\u683c\u6a21\u5f0f\uff0c\u6b64\u65b9\u6cd5\u8d85\u51fa\u65f6\u95f4\u8303\u56f4\u4f1a\u62a5\u9519\uff0c\u6bcf\u4e2a\u6708\u6700\u591a 6 \u5468\uff0c\u6b64\u5904\u5374\u9700\u8981\u83b7\u53d6\u7b2c 7 \u5468\u7684\u5468\u4e00\n// \u4f46\u5982\u679c\u5728\u8c03\u7528\u65b9\u6cd5\u524d\u5c06\u6a21\u5f0f\u4fee\u6539\u4e3a\u5bbd\u5bb9\uff0c\u5219\u4e0d\u4f1a\u62a5\u9519\uff0c\u6b63\u5e38\u8fd4\u56de\uff0c\u5982\u679c\u4fee\u6539\u4e3a\u667a\u80fd\uff0c\u7ed3\u679c\u8d85\u51fa\u672c\u6708\u65f6\u4f1a\u8fd4\u56de\u672c\u6708\u7684\u6700\u540e\u4e00\u5929\nDateUtils.getStartDayOfWeekOfMonth(LocalDate.now(), 7);\n")),(0,n.kt)("h2",{id:"locale---\u533a\u57df"},"LOCALE - \u533a\u57df"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},'// \u603b\u662f\u8bbe\u7f6e\u89e3\u6790\u5668\u6a21\u5f0f\u4e3a\u4e2d\u6587 \nDateFeature.setAlways(Locale.SIMPLIFIED_CHINESE);\n// \u8f93\u51fa\u5468\u65f6\u7ed3\u679c\u4e3a\u4e2d\u6587\nDateUtils.format(LocalDate.now(), "E")\n// \u8f93\u51fa\u6708\u65f6\u7ed3\u679c\u4ecd\u4e3a\u4e2d\u6587\nDateUtils.format(LocalDate.now(), "MMM")\n')),(0,n.kt)("h2",{id:"zone_id---\u65f6\u533a\u533a\u57df-id"},"ZONE_ID - \u65f6\u533a/\u533a\u57df ID"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"// \u4e34\u65f6\u8bbe\u7f6e\u65f6\u533a\nDateFeature.set(ZoneId.from(ZoneOffset.UTC));\n// \u5047\u8bbe\u7cfb\u7edf\u65f6\u533a\u4e3a UTC+8\uff0c\u56e0\u4e3a\u4e0a\u4e00\u884c\u8bbe\u7f6e\u4e86\u65f6\u533a\uff0c\u6240\u4ee5\u5b9e\u9645\u7ed3\u679c\u4f1a\u6bd4\u7cfb\u7edf\u65f6\u95f4\u5c11 8 \u5c0f\u65f6\nDateUtils.format(LocalDateTime.now());\n")),(0,n.kt)("h2",{id:"min_date_year---\u6700\u5c0f-date-\u5e74"},"MIN_DATE_YEAR - \u6700\u5c0f Date \u5e74"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"// \u4e34\u65f6\u8bbe\u7f6e\u6700\u5c0f Date \u5e74\nDateFeature.setMinDateYear(1L);\n// Date \u7684\u5e74\u4efd\u4e3a 1\uff0c\u800c\u4e0d\u662f\u9ed8\u8ba4\u7684 1970\nDateUtils.toDate(LocalTime.now());\n\n")))}s.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[817],{1310:(e,t,n)=>{n.d(t,{Z:()=>E});var a=n(7462),r=n(7294),i=n(6010),l=n(5281),s=n(2802),c=n(8596),o=n(9960),m=n(5999),d=n(4996);function u(e){return r.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),r.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const h="breadcrumbHomeIcon_YNFT";function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},r.createElement(u,{className:h})))}const v="breadcrumbsContainer_Z_bl";function g(e){let{children:t,href:n,isLast:a}=e;const i="breadcrumbs__link";return a?r.createElement("span",{className:i,itemProp:"name"},t):n?r.createElement(o.Z,{className:i,href:n,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:n,index:l,addMicrodata:s}=e;return r.createElement("li",(0,a.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,n)=>{const a=n===e.length-1;return r.createElement(p,{key:n,active:a,index:n,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:a},t.label))})))):null}},4228:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});var a=n(7294),r=n(1944),i=n(2802),l=n(4996),s=n(6010),c=n(9960),o=n(3919),m=n(5999);const d="cardContainer_fWXF",u="cardTitle_rnsV",h="cardDescription_PWke";function b(e){let{href:t,children:n}=e;return a.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d)},n)}function v(e){let{href:t,icon:n,title:r,description:i}=e;return a.createElement(b,{href:t},a.createElement("h2",{className:(0,s.Z)("text--truncate",u),title:r},n," ",r),i&&a.createElement("p",{className:(0,s.Z)("text--truncate",h),title:i},i))}function g(e){let{item:t}=e;const n=(0,i.Wl)(t);return n?a.createElement(v,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function p(e){let{item:t}=e;const n=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return a.createElement(v,{href:t.href,icon:n,title:t.label,description:t.description??r?.description})}function E(e){let{item:t}=e;switch(t.type){case"link":return a.createElement(p,{item:t});case"category":return a.createElement(g,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function f(e){let{className:t}=e;const n=(0,i.jA)();return a.createElement(N,{items:n.items,className:t})}function N(e){const{items:t,className:n}=e;if(!t)return a.createElement(f,e);const r=(0,i.MN)(t);return a.createElement("section",{className:(0,s.Z)("row",n)},r.map(((e,t)=>a.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},a.createElement(E,{item:e})))))}var Z=n(49),k=n(3120),_=n(4364),L=n(1310),T=n(2503);const x="generatedIndexPage_vN6x",y="list_eTzJ",I="title_kItE";function w(e){let{categoryGeneratedIndex:t}=e;return a.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function V(e){let{categoryGeneratedIndex:t}=e;const n=(0,i.jA)();return a.createElement("div",{className:x},a.createElement(k.Z,null),a.createElement(L.Z,null),a.createElement(_.Z,null),a.createElement("header",null,a.createElement(T.Z,{as:"h1",className:I},t.title),t.description&&a.createElement("p",null,t.description)),a.createElement("article",{className:"margin-top--lg"},a.createElement(N,{items:n.items,className:y})),a.createElement("footer",{className:"margin-top--lg"},a.createElement(Z.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function A(e){return a.createElement(a.Fragment,null,a.createElement(w,e),a.createElement(V,e))}},49:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(7462),r=n(7294),i=n(5999),l=n(2244);function s(e){const{previous:t,next:n}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&r.createElement(l.Z,(0,a.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&r.createElement(l.Z,(0,a.Z)({},n,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(7294),r=n(6010),i=n(5999),l=n(5281),s=n(4477);function c(e){let{className:t}=e;const n=(0,s.E)();return n.badge?a.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}},3120:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(7294),r=n(6010),i=n(2263),l=n(9960),s=n(5999),c=n(143),o=n(5281),m=n(373),d=n(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return a.createElement(t,e)}function b(e){let{versionLabel:t,to:n,onClick:r}=e;return a.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(l.Z,{to:n,onClick:r},a.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function v(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return a.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(h,{siteTitle:l,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const n=(0,d.E)();return n.banner?a.createElement(v,{className:t,versionMetadata:n}):null}},2503:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(7462),r=n(7294),i=n(6010),l=n(5999),s=n(6668),c=n(9960);const o="anchorWithStickyNavbar_LWe7",m="anchorWithHideOnScrollNavbar_WYt5";function d(e){let{as:t,id:n,...d}=e;const{navbar:{hideOnScroll:u}}=(0,s.L)();if("h1"===t||!n)return r.createElement(t,(0,a.Z)({},d,{id:void 0}));const h=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof d.children?d.children:n});return r.createElement(t,(0,a.Z)({},d,{className:(0,i.Z)("anchor",u?m:o,d.className),id:n}),d.children,r.createElement(c.Z,{className:"hash-link",to:`#${n}`,"aria-label":h,title:h},"\u200b"))}},2244:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(7294),r=n(6010),i=n(9960);function l(e){const{permalink:t,title:n,subLabel:l,isNext:s}=e;return a.createElement(i.Z,{className:(0,r.Z)("pagination-nav__link",s?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},l&&a.createElement("div",{className:"pagination-nav__sublabel"},l),a.createElement("div",{className:"pagination-nav__label"},n))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[918],{1310:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(7462),l=n(7294),r=n(6010),s=n(5281),o=n(2802),c=n(8596),i=n(9960),d=n(5999),m=n(4996);function u(e){return l.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),l.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const v="breadcrumbHomeIcon_YNFT";function h(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},l.createElement(u,{className:v})))}const p="breadcrumbsContainer_Z_bl";function b(e){let{children:t,href:n,isLast:a}=e;const r="breadcrumbs__link";return a?l.createElement("span",{className:r,itemProp:"name"},t):n?l.createElement(i.Z,{className:r,href:n,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:r},t)}function E(e){let{children:t,active:n,index:s,addMicrodata:o}=e;return l.createElement("li",(0,a.Z)({},o&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,r.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,l.createElement("meta",{itemProp:"position",content:String(s+1)}))}function f(){const e=(0,o.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,r.Z)(s.k.docs.docBreadcrumbs,p),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(h,null),e.map(((t,n)=>{const a=n===e.length-1;return l.createElement(E,{key:n,active:a,index:n,addMicrodata:!!t.href},l.createElement(b,{href:t.href,isLast:a},t.label))})))):null}},5154:(e,t,n)=>{n.r(t),n.d(t,{default:()=>J});var a=n(7294),l=n(1944),r=n(902);const s=a.createContext(null);function o(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(s.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(s);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(6010),m=n(7524),u=n(49);function v(){const{metadata:e}=c();return a.createElement(u.Z,{previous:e.previous,next:e.next})}var h=n(3120),p=n(4364),b=n(5281),E=n(5999);function f(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(E.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function g(e){let{lastUpdatedBy:t}=e;return a.createElement(E.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function L(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:b.k.common.lastUpdated},a.createElement(E.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(f,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(g,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var N=n(4881),Z=n(1526);const _="lastUpdated_vwxv";function k(e){return a.createElement("div",{className:(0,d.Z)(b.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(Z.Z,e)))}function C(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.Z)(b.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(N.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",_)},(n||l)&&a.createElement(L,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function T(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:s}=e,o=s.length>0,i=!!(t||n||r);return o||i?a.createElement("footer",{className:(0,d.Z)(b.k.docs.docFooter,"docusaurus-mt-lg")},o&&a.createElement(k,{tags:s}),i&&a.createElement(C,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var x=n(6043),H=n(3743),U=n(7462);const y="tocCollapsibleButton_TO0P",A="tocCollapsibleButtonExpanded_MG3E";function w(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,U.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",y,!t&&A,n.className)}),a.createElement(E.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const M="tocCollapsible_ETCw",B="tocCollapsibleContent_vkbj",I="tocCollapsibleExpanded_sAul";function V(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:s,toggleCollapsed:o}=(0,x.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(M,!s&&I,n)},a.createElement(w,{collapsed:s,onClick:o}),a.createElement(x.z,{lazy:!0,className:B,collapsed:s},a.createElement(H.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const O="tocMobile_ITEo";function S(){const{toc:e,frontMatter:t}=c();return a.createElement(V,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(b.k.docs.docTocMobile,O)})}var P=n(9407);function z(){const{toc:e,frontMatter:t}=c();return a.createElement(P.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:b.k.docs.docTocDesktop})}var D=n(2503),R=n(7654);function F(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(b.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(D.Z,{as:"h1"},n)),a.createElement(R.Z,null,t))}var j=n(1310);const q="docItemContainer_Djhp",G="docItemCol_VOVn";function $(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?a.createElement(S,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(z,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&G)},a.createElement(h.Z,null),a.createElement("div",{className:q},a.createElement("article",null,a.createElement(j.Z,null),a.createElement(p.Z,null),n.mobile,a.createElement(F,null,t),a.createElement(T,null)),a.createElement(v,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function J(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(o,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement($,null,a.createElement(n,null))))}},49:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(7462),l=n(7294),r=n(5999),s=n(2244);function o(e){const{previous:t,next:n}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,r.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&l.createElement(s.Z,(0,a.Z)({},t,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&l.createElement(s.Z,(0,a.Z)({},n,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(7294),l=n(6010),r=n(5999),s=n(5281),o=n(4477);function c(e){let{className:t}=e;const n=(0,o.E)();return n.badge?a.createElement("span",{className:(0,l.Z)(t,s.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}},3120:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(7294),l=n(6010),r=n(2263),s=n(9960),o=n(5999),c=n(143),i=n(5281),d=n(373),m=n(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(o.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(o.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function v(e){const t=u[e.versionMetadata.banner];return a.createElement(t,e)}function h(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(o.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(s.Z,{to:n,onClick:l},a.createElement(o.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function p(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,r.Z)(),{pluginId:o}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(o),{latestDocSuggestion:u,latestVersionSuggestion:p}=(0,c.Jo)(o),b=u??(E=p).docs.find((e=>e.id===E.mainDocId));var E;return a.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(v,{siteTitle:s,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(h,{versionLabel:p.label,to:b.path,onClick:()=>m(p.name)})))}function b(e){let{className:t}=e;const n=(0,m.E)();return n.banner?a.createElement(p,{className:t,versionMetadata:n}):null}},4881:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(7294),l=n(5999),r=n(5281),s=n(7462),o=n(6010);const c="iconEdit_Z9Sw";function i(e){let{className:t,...n}=e;return a.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(c,t),"aria-hidden":"true"},n),a.createElement("g",null,a.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function d(e){let{editUrl:t}=e;return a.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},a.createElement(i,null),a.createElement(l.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},2244:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(7294),l=n(6010),r=n(9960);function s(e){const{permalink:t,title:n,subLabel:s,isNext:o}=e;return a.createElement(r.Z,{className:(0,l.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},s&&a.createElement("div",{className:"pagination-nav__sublabel"},s),a.createElement("div",{className:"pagination-nav__label"},n))}},3743:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(7462),l=n(7294),r=n(6668);function s(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function o(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=o({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function d(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,r.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:s}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:s}),c=i(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function h(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...h}=e;const p=(0,r.L)(),b=d??p.tableOfContents.minHeadingLevel,E=u??p.tableOfContents.maxHeadingLevel,f=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>o({toc:s(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:b,maxHeadingLevel:E});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:b,maxHeadingLevel:E}}),[c,i,b,E])),l.createElement(v,(0,a.Z)({toc:f,className:n,linkClassName:c},h))}},9407:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(7462),l=n(7294),r=n(6010),s=n(3743);const o="tableOfContents_bqdL";function c(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(o,"thin-scrollbar",t)},l.createElement(s.Z,(0,a.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}},3008:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(7294),l=n(6010),r=n(9960);const s="tag_zVej",o="tagRegular_sFm0",c="tagWithCount_h2kH";function i(e){let{permalink:t,label:n,count:i}=e;return a.createElement(r.Z,{href:t,className:(0,l.Z)(s,i?c:o)},n,i&&a.createElement("span",null,i))}},1526:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(7294),l=n(6010),r=n(5999),s=n(3008);const o="tags_jXut",c="tag_QGVx";function i(e){let{tags:t}=e;return a.createElement(a.Fragment,null,a.createElement("b",null,a.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),a.createElement("ul",{className:(0,l.Z)(o,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return a.createElement("li",{key:n,className:c},a.createElement(s.Z,{label:t,permalink:n}))}))))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[514,972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>Ce});var a=n(7294),l=n(6010),o=n(1944),r=n(5281),c=n(3320),i=n(2802),s=n(4477),d=n(1116),m=n(7961),u=n(5999),b=n(2466),p=n(5936);const h="backToTopButton_sjWU",E="backToTopButtonShow_xfvO";function f(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a<t?l(!1):a+window.innerHeight<document.documentElement.scrollHeight&&l(!0))})),(0,p.S)((e=>{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h,e&&E),type:"button",onClick:t})}var g=n(6550),_=n(7524),v=n(6668),k=n(1327),C=n(7462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I="collapseSidebarButton_PEFL",N="collapseSidebarButtonIcon_kv0_";function Z(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.Z)("button button--secondary button--outline",I),onClick:t},a.createElement(S,{className:N}))}var T=n(9689),y=n(902);const x=Symbol("EmptyContext"),w=a.createContext(x);function L(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(w.Provider,{value:o},t)}var A=n(6043),M=n(8596),B=n(9960),F=n(2389);function H(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function P(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,v.L)(),f=function(e){const t=(0,F.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),g=(0,i._F)(t,o),_=(0,M.Mg)(h,o),{collapsed:k,setCollapsed:S}=(0,A.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(w);if(e===x)throw new y.i6("DocSidebarItemsExpandedStateProvider");return e}(),Z=function(e){void 0===e&&(e=!k),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,y.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:g,collapsed:k,updateCollapsed:Z}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":k},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(B.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?Z(!1):(e.preventDefault(),Z())}:()=>{n?.(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!k:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(H,{categoryLabel:u,onClick:e=>{e.preventDefault(),Z()}})),a.createElement(A.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:k},a.createElement(G,{items:m,tabIndex:k?-1:0,onItemClick:n,activePath:o,level:c+1})))}var W=n(3919),D=n(9471);const R="menuExternalLink_NmtK";function z(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,W.Z)(m);return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(B.Z,(0,C.Z)({className:(0,l.Z)("menu__link",!E&&R,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(D.Z,null)))}const V="menuHtmlItem_M9Kj";function U(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[V,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function K(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(P,(0,C.Z)({item:t},n));case"html":return a.createElement(U,(0,C.Z)({item:t},n));default:return a.createElement(z,(0,C.Z)({item:t},n))}}function j(e){let{items:t,...n}=e;return a.createElement(L,null,t.map(((e,t)=>a.createElement(K,(0,C.Z)({key:t,item:e,index:t},n)))))}const G=(0,a.memo)(j),Y="menu_SIkG",q="menuWithAnnouncementBar_GW3s";function O(e){let{path:t,sidebar:n,className:o}=e;const c=function(){const{isActive:e}=(0,T.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,l.Z)("menu thin-scrollbar",Y,c&&q,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(G,{items:n,activePath:t,level:1})))}const X="sidebar_njMd",J="sidebarWithHideableNavbar_wUlq",Q="sidebarHidden_VK0M",$="sidebarLogo_isFc";function ee(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,v.L)();return a.createElement("div",{className:(0,l.Z)(X,c&&J,r&&Q)},c&&a.createElement(k.Z,{tabIndex:-1,className:$}),a.createElement(O,{path:t,sidebar:n}),i&&a.createElement(Z,{onClick:o}))}const te=a.memo(ee);var ne=n(3102),ae=n(2961);const le=e=>{let{sidebar:t,path:n}=e;const o=(0,ae.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(G,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function oe(e){return a.createElement(ne.Zo,{component:le,props:e})}const re=a.memo(oe);function ce(e){const t=(0,_.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement(te,e),l&&a.createElement(re,e))}const ie="expandButton_m80_",se="expandButtonIcon_BlDH";function de(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:ie,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:se}))}const me={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function ue(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function be(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:c}=(0,g.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.Z)(r.k.docs.docSidebarContainer,me.docSidebarContainer,n&&me.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(me.docSidebarContainer)&&n&&s(!0)}},a.createElement(ue,null,a.createElement("div",{className:(0,l.Z)(me.sidebarViewport,i&&me.sidebarViewportHidden)},a.createElement(ce,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(de,{toggleSidebar:d}))))}const pe={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function he(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(pe.docMainContainer,(t||!o)&&pe.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.Z)("container padding-top--md padding-bottom--lg",pe.docItemWrapper,t&&pe.docItemWrapperEnhanced)},n))}const Ee="docPage__5DB",fe="docsWrapper_BCFX";function ge(e){let{children:t}=e;const n=(0,d.V)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:fe},a.createElement(f,null),a.createElement("div",{className:Ee},n&&a.createElement(be,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(he,{hiddenSidebarContainer:l},t)))}var _e=n(4972),ve=n(197);function ke(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(ve.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function Ce(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(_e.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(ke,e),a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(ge,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(7294),l=n(5999),o=n(1944),r=n(7961);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[675],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(r),f=o,d=s["".concat(u,".").concat(f)]||s[f]||m[f]||l;return r?n.createElement(d,a(a({ref:t},p),{},{components:r})):n.createElement(d,a({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,a=new Array(l);a[0]=f;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:o,a[1]=i;for(var c=2;c<l;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},3289:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const l={slug:"welcome",title:"\u6b22\u8fce",authors:["duanluan"],tags:["hello"]},a=void 0,i={permalink:"/ZUtil/blog/welcome",editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-16-welcome/index.md",source:"@site/blog/2022-07-16-welcome/index.md",title:"\u6b22\u8fce",description:"Hello, World!",date:"2022-07-16T00:00:00.000Z",formattedDate:"2022\u5e747\u670816\u65e5",tags:[{label:"hello",permalink:"/ZUtil/blog/tags/hello"}],readingTime:.405,hasTruncateMarker:!1,authors:[{name:"ZhongJianhao",title:"Maintainer of ZUtil",url:"https://github.com/duanluan",imageURL:"https://github.com/duanluan.png",key:"duanluan"}],frontMatter:{slug:"welcome",title:"\u6b22\u8fce",authors:["duanluan"],tags:["hello"]},prevItem:{title:"java.time \u65f6\u533a\u8be6\u89e3",permalink:"/ZUtil/blog/javaTimeZone"}},u={authorsImageUrls:[void 0]},c=[],p={toc:c};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Hello, World!"),(0,o.kt)("p",null,"\u6b22\u8fce\u8bbf\u95ee\u6211\u7684\u535a\u5ba2\uff1a",(0,o.kt)("a",{parentName:"p",href:"http://blog.zhjh.top/"},"\u6b32\u7a77\u4e09\u5343\u754c\u7684\u535a\u5ba2")),(0,o.kt)("h1",{id:"\u66f4\u5feb"},"\u66f4\u5feb"),(0,o.kt)("p",null,"\u4ee5\u4e0b\u5217\u51fa\u90e8\u5206\uff08\u5c01\u88c5\u7b2c\u4e09\u65b9\u7684\u4e0d\u5217\uff09\u548c hutool\uff085.8+\uff09\u7684 JMH \u5bf9\u6bd4\u6d4b\u8bd5\uff08\u4ec5\u541e\u5410\u91cf\uff0c\u5176\u4ed6\u8bf7\u67e5\u770b\u6e90\u7801\uff09\uff0c\u683c\u5f0f\u4e3a\uff1aZUtil \u541e\u5410\u91cf / hutool \u541e\u5410\u91cf = \u5feb\u591a\u5c11\u500d"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5b57\u7b26\u4e32\u8f6c\u62fc\u97f3\uff1a8.944 / 2.636 = 3.39")))}s.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[237],{8391:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});var n=a(7294),l=a(6010),r=a(9960),c=a(2263),i=a(7961),s=a(7462);const m="features_t9lD",o=[{title:"\u66f4\u5feb",description:n.createElement(n.Fragment,null,"\u4f7f\u7528 JMH \u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\u3002",n.createElement("br",null),n.createElement("a",{href:"https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/jmh",target:"_blank"},"https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/jmh"))},{title:"\u66f4\u5168",description:n.createElement(n.Fragment,null,n.createElement("a",{href:"https://github.com/duanluan/ZUtil/blob/main/src/main/java/top/csaf/date/DateUtils.java",target:"_blank"},"\u65f6\u95f4\u5de5\u5177\u7c7b"),"\u8fd1 120 \u4e2a\u65b9\u6cd5\uff0c2500+ \u884c\uff1b",n.createElement("br",null),n.createElement("a",{href:"https://github.com/duanluan/ZUtil/blob/main/src/main/java/top/csaf/regex/RegExUtils.java",target:"_blank"},"\u6b63\u5219\u5de5\u5177\u7c7b"),"\u8fd1 50 \u4e2a\u65b9\u6cd5\uff0c750+ \u884c\u3002",n.createElement("br",null),"\u5176\u4ed6\u5de5\u5177\u7c7b\u4e5f\u5728\u6301\u7eed\u66f4\u65b0\u4e2d\u2026\u2026")},{title:"\u66f4\u5b89\u5168",description:n.createElement(n.Fragment,null,"\u4f7f\u7528 ",n.createElement("a",{href:"https://junit.org/junit5/",target:"_blank"},"JUnit")," \u8fdb\u884c\u5957\u4ef6\u6d4b\u8bd5\uff0c",n.createElement("a",{href:"https://www.jacoco.org/jacoco/index.html",target:"_blank"},"JaCoCo")," \u8fdb\u884c\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u8bd5\uff0c\u4fdd\u8bc1\u6bcf\u884c\u4ee3\u7801\u90fd\u7b26\u5408\u9884\u671f\uff0c\u66f4\u5c11\u51fa BUG\u3002",n.createElement("br",null),n.createElement("a",{href:"https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/junit",target:"_blank"},"https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/junit"))}];function u(e){let{title:t,description:a}=e;return n.createElement("div",{className:(0,l.Z)("col col--4")},n.createElement("div",{className:"text--center padding-horiz--md"},n.createElement("h3",null,t),n.createElement("p",null,a)))}function h(){return n.createElement("section",{className:m},n.createElement("div",{className:"container"},n.createElement("div",{className:"row"},o.map(((e,t)=>n.createElement(u,(0,s.Z)({key:t},e)))))))}const d="heroBanner_qdFl",E="buttons_AeoN";function p(){const{siteConfig:e}=(0,c.Z)();return n.createElement("header",{className:(0,l.Z)("hero hero--primary",d)},n.createElement("div",{className:"container"},n.createElement("h1",{className:"hero__title"},e.title),n.createElement("p",{className:"hero__subtitle"},e.tagline),n.createElement("div",{className:E},n.createElement(r.Z,{className:"button button--secondary button--lg",to:"/docs/introduction"},"ZUtil \u6559\u7a0b - 5min \u23f1\ufe0f"))))}function b(){const{siteConfig:e}=(0,c.Z)();return n.createElement(i.Z,{title:`Hello from ${e.title}`,description:"Description will go into a meta tag in <head />"},n.createElement(p,null),n.createElement("main",null,n.createElement(h,null)))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[85],{4247:(e,n,t)=>{t.r(n),t.d(n,{default:()=>d});var l=t(7294),a=t(6010),c=t(1944),r=t(5281),i=t(7961),o=t(7654),s=t(9407);const m="mdxPageWrapper_j9I6";function d(e){const{content:n}=e,{metadata:{title:t,description:d,frontMatter:u}}=n,{wrapperClassName:f,hide_table_of_contents:v}=u;return l.createElement(c.FG,{className:(0,a.Z)(f??r.k.wrapper.mdxPages,r.k.page.mdxPage)},l.createElement(c.d,{title:t,description:d}),l.createElement(i.Z,null,l.createElement("main",{className:"container container--fluid margin-vert--lg"},l.createElement("div",{className:(0,a.Z)("row",m)},l.createElement("div",{className:(0,a.Z)("col",!v&&"col--8")},l.createElement("article",null,l.createElement(o.Z,null,l.createElement(n,null)))),!v&&n.toc.length>0&&l.createElement("div",{className:"col col--2"},l.createElement(s.Z,{toc:n.toc,minHeadingLevel:u.toc_min_heading_level,maxHeadingLevel:u.toc_max_heading_level}))))))}},3743:(e,n,t)=>{t.d(n,{Z:()=>v});var l=t(7462),a=t(7294),c=t(6668);function r(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const l=t.slice(2,e.level);e.parentIndex=Math.max(...l),t[e.level]=n}));const l=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):l.push(a)})),l}function i(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:l}=e;return n.flatMap((e=>{const n=i({toc:e.children,minHeadingLevel:t,maxHeadingLevel:l});return function(e){return e.level>=t&&e.level<=l}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function s(e,n){let{anchorTopOffset:t}=n;const l=e.find((e=>o(e).top>=t));if(l){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(l))?l:e[e.indexOf(l)-1]??null}return e[e.length-1]??null}function m(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:n}}=(0,c.L)();return(0,a.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,a.useRef)(void 0),t=m();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:l,linkActiveClassName:a,minHeadingLevel:c,maxHeadingLevel:r}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(l),i=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const l=[];for(let a=n;a<=t;a+=1)l.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(l.join()))}({minHeadingLevel:c,maxHeadingLevel:r}),o=s(i,{anchorTopOffset:t.current}),m=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,t])}function u(e){let{toc:n,className:t,linkClassName:l,isChild:c}=e;return n.length?a.createElement("ul",{className:c?void 0:t},n.map((e=>a.createElement("li",{key:e.id},a.createElement("a",{href:`#${e.id}`,className:l??void 0,dangerouslySetInnerHTML:{__html:e.value}}),a.createElement(u,{isChild:!0,toc:e.children,className:t,linkClassName:l}))))):null}const f=a.memo(u);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...v}=e;const g=(0,c.L)(),h=m??g.tableOfContents.minHeadingLevel,L=u??g.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:l}=e;return(0,a.useMemo)((()=>i({toc:r(n),minHeadingLevel:t,maxHeadingLevel:l})),[n,t,l])}({toc:n,minHeadingLevel:h,maxHeadingLevel:L});return d((0,a.useMemo)((()=>{if(o&&s)return{linkClassName:o,linkActiveClassName:s,minHeadingLevel:h,maxHeadingLevel:L}}),[o,s,h,L])),a.createElement(f,(0,l.Z)({toc:p,className:t,linkClassName:o},v))}},9407:(e,n,t)=>{t.d(n,{Z:()=>o});var l=t(7462),a=t(7294),c=t(6010),r=t(3743);const i="tableOfContents_bqdL";function o(e){let{className:n,...t}=e;return a.createElement("div",{className:(0,c.Z)(i,"thin-scrollbar",n)},a.createElement(r.Z,(0,l.Z)({},t,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[405],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(n),g=o,f=d["".concat(c,".").concat(g)]||d[g]||u[g]||a;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:o,i[1]=l;for(var s=2;s<a;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},488:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={},i="\u5165\u95e8",l={unversionedId:"introduction",id:"introduction",title:"\u5165\u95e8",description:"\u5b89\u88c5",source:"@site/docs/002-introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/ZUtil/docs/introduction",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/002-introduction.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"\u4ecb\u7ecd",permalink:"/ZUtil/docs/intro"},next:{title:"\u53c2\u8003\u624b\u518c",permalink:"/ZUtil/docs/category/\u53c2\u8003\u624b\u518c"}},c={},s=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"Maven",id:"maven",level:3},{value:"Gradle",id:"gradle",level:3},{value:"\u5b89\u88c5\u6ce8\u610f",id:"\u5b89\u88c5\u6ce8\u610f",level:2},{value:"Maven",id:"maven-1",level:3},{value:"Gradle",id:"gradle-1",level:3},{value:"\u8d44\u6e90",id:"\u8d44\u6e90",level:2}],p={toc:s};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u5165\u95e8"},"\u5165\u95e8"),(0,o.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,o.kt)("h3",{id:"maven"},"Maven"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-xml"},"<dependency>\n <groupId>top.csaf</groupId>\n <artifactId>ZUtil</artifactId>\n <version>1.12.0</version>\n</dependency>\n")),(0,o.kt)("h3",{id:"gradle"},"Gradle"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-groovy"},"// groovy\nimplementation 'top.csaf:ZUtil:1.12.0'\n// kotlin\nimplementation(\"top.csaf:ZUtil:1.12.0\")\n")),(0,o.kt)("h2",{id:"\u5b89\u88c5\u6ce8\u610f"},"\u5b89\u88c5\u6ce8\u610f"),(0,o.kt)("p",null,"\u5de5\u5177\u5305\u4e2d\u5df2\u4f7f\u7528 slf4j-api \u548c slf4j-simple\uff0c\u548c spring-boot-starter-web \u540c\u65f6\u4f7f\u7528\u65f6\u4f1a\u51b2\u7a81\uff0c\u9700\u8981\u624b\u52a8\u6392\u9664\u3002"),(0,o.kt)("h3",{id:"maven-1"},"Maven"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-xml"},"\x3c!-- \u65b9\u5f0f\u4e00\uff1aZUtil \u6392\u9664 slf4j --\x3e\n<dependency>\n <groupId>top.csaf</groupId>\n <artifactId>ZUtil</artifactId>\n <version>1.12.0</version>\n <exclusions>\n <exclusion>\n <groupId>org.slf4j</groupId>\n <artifactId>slf4j-api</artifactId>\n </exclusion>\n <exclusion>\n <groupId>org.slf4j</groupId>\n <artifactId>slf4j-simple</artifactId>\n </exclusion>\n </exclusions>\n</dependency>\n\n\x3c!-- \u65b9\u5f0f\u4e8c\uff1aspring-boot-starter-web \u6392\u9664 Logback --\x3e\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n <exclusions>\n <exclusion>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-logging</artifactId>\n </exclusion>\n </exclusions>\n</dependency>\n")),(0,o.kt)("h3",{id:"gradle-1"},"Gradle"),(0,o.kt)("p",null,"\u53c2\u8003\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://docs.gradle.org/current/userguide/dependency_downgrade_and_exclude.html#sec:excluding-transitive-deps"},"Excluding transitive dependencies - Gradle User Manual")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-groovy"},"// groovy\ndependencies {\n // \u65b9\u5f0f\u4e00\uff1aZUtil \u6392\u9664 slf4j\n implementation('top.csaf:ZUtil:1.12.0') {\n exclude group: 'org.slf4j', module: 'slf4j-api'\n exclude group: 'org.slf4j', module: 'slf4j-simple'\n }\n // \u65b9\u5f0f\u4e8c\uff1aspring-boot-starter-web \u6392\u9664 Logback\n implementation('org.springframework.boot:spring-boot-starter-web') {\n exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'\n }\n}\n\n// kotlin\ndependencies {\n // \u65b9\u5f0f\u4e00\uff1aZUtil \u6392\u9664 slf4j\n implementation(\"top.csaf:ZUtil:1.12.0\") {\n exclude(group = \"org.slf4j\", module = \"slf4j-api\")\n exclude(group = \"org.slf4j\", module = \"slf4j-simple\")\n }\n // \u65b9\u5f0f\u4e8c\uff1aspring-boot-starter-web \u6392\u9664 Logback\n implementation(\"org.springframework.boot:spring-boot-starter-web\") {\n exclude(group = \"org.springframework.boot\", module = \"spring-boot-starter-logging\")\n }\n}\n\n")),(0,o.kt)("h2",{id:"\u8d44\u6e90"},"\u8d44\u6e90"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/top.csaf/ZUtil"},"Maven \u4e2d\u592e\u5e93")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://mvnrepository.com/artifact/top.csaf/ZUtil"},"Maven Repository"))))}d.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[414],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),i=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(l.Provider,{value:t},e.children)},f="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),f=i(r),m=o,d=f["".concat(l,".").concat(m)]||f[m]||s[m]||a;return r?n.createElement(d,p(p({ref:t},u),{},{components:r})):n.createElement(d,p({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[f]="string"==typeof e?e:o,p[1]=c;for(var i=2;i<a;i++)p[i]=r[i];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3123:(e,t,r)=>{r.r(t),r.d(t,{contentTitle:()=>p,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={title:"Markdown page example"},p="Markdown page example",c={type:"mdx",permalink:"/ZUtil/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"}},l=[],i={toc:l};function u(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"markdown-page-example"},"Markdown page example"),(0,o.kt)("p",null,"You don't need React to write simple standalone pages."))}u.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[28],{8044:e=>{e.exports=JSON.parse('{"permalink":"/ZUtil/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[284],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var r=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function c(e,n){if(null==e)return{};var t,r,i=function(e,n){if(null==e)return{};var t,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=r.createContext({}),p=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},u=function(e){var n=p(e.components);return r.createElement(l.Provider,{value:n},e.children)},s="mdxType",y={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=p(t),d=i,f=s["".concat(l,".").concat(d)]||s[d]||y[d]||o;return t?r.createElement(f,a(a({ref:n},u),{},{components:t})):r.createElement(f,a({ref:n},u))}));function f(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var o=t.length,a=new Array(o);a[0]=d;var c={};for(var l in n)hasOwnProperty.call(n,l)&&(c[l]=n[l]);c.originalType=e,c[s]="string"==typeof e?e:i,a[1]=c;for(var p=2;p<o;p++)a[p]=t[p];return r.createElement.apply(null,a)}return r.createElement.apply(null,t)}d.displayName="MDXCreateElement"},3474:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=t(7462),i=(t(7294),t(3905));const o={},a="PinyinFeature \u62fc\u97f3\u7279\u6027",c={unversionedId:"reference-doc/pinyin/pinyinFeature",id:"reference-doc/pinyin/pinyinFeature",title:"PinyinFeature \u62fc\u97f3\u7279\u6027",description:"\u53ef\u4ee5\u901a\u8fc7\u4e34\u65f6\u6216\u603b\u662f\uff08Always\uff09\u4fee\u6539\u5176\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u6765\u51b3\u5b9a PinyinUtils \u4e2d\u65b9\u6cd5\u5bf9\u62fc\u97f3\u7684\u5904\u7406\u65b9\u5f0f\u3002",source:"@site/docs/003-reference-doc/pinyin/001-pinyinFeature.md",sourceDirName:"003-reference-doc/pinyin",slug:"/reference-doc/pinyin/pinyinFeature",permalink:"/ZUtil/docs/reference-doc/pinyin/pinyinFeature",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/pinyin/001-pinyinFeature.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"pinyin \u62fc\u97f3",permalink:"/ZUtil/docs/category/pinyin-\u62fc\u97f3"},next:{title:"\u4e0d\u517c\u5bb9\u53d8\u66f4",permalink:"/ZUtil/docs/incompatible-changes"}},l={},p=[{value:"FIRST_WORD_INITIAL_CAP - \u7b2c\u4e00\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199",id:"first_word_initial_cap---\u7b2c\u4e00\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199",level:2},{value:"SECOND_WORD_INITIAL_CAP - \u7b2c\u4e8c\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199",id:"second_word_initial_cap---\u7b2c\u4e8c\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199",level:2},{value:"HAS_SEPARATOR_BY_NOT_PINYIN_AROUND - \u975e\u62fc\u97f3\u524d\u540e\u662f\u5426\u9700\u8981\u5206\u9694\u7b26",id:"has_separator_by_not_pinyin_around---\u975e\u62fc\u97f3\u524d\u540e\u662f\u5426\u9700\u8981\u5206\u9694\u7b26",level:2}],u={toc:p};function s(e){let{components:n,...t}=e;return(0,i.kt)("wrapper",(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"pinyinfeature-\u62fc\u97f3\u7279\u6027"},"PinyinFeature \u62fc\u97f3\u7279\u6027"),(0,i.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7\u4e34\u65f6\u6216\u603b\u662f\uff08Always\uff09\u4fee\u6539\u5176\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u6765\u51b3\u5b9a PinyinUtils \u4e2d\u65b9\u6cd5\u5bf9\u62fc\u97f3\u7684\u5904\u7406\u65b9\u5f0f\u3002"),(0,i.kt)("h2",{id:"first_word_initial_cap---\u7b2c\u4e00\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199"},"FIRST_WORD_INITIAL_CAP - \u7b2c\u4e00\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199"),(0,i.kt)("p",null,"\u7b2c\u4e00\u4e2a\u6c49\u5b57\u7684\u62fc\u97f3\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199\uff0c\u9ed8\u8ba4\u4e3a false\u3002"),(0,i.kt)("h2",{id:"second_word_initial_cap---\u7b2c\u4e8c\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199"},"SECOND_WORD_INITIAL_CAP - \u7b2c\u4e8c\u4e2a\u5355\u8bcd\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199"),(0,i.kt)("p",null,"\u540e\u7eed\u6c49\u5b57\u7684\u62fc\u97f3\u9996\u5b57\u6bcd\u662f\u5426\u5927\u5199\uff0c\u9ed8\u8ba4\u4e3a false\u3002"),(0,i.kt)("h2",{id:"has_separator_by_not_pinyin_around---\u975e\u62fc\u97f3\u524d\u540e\u662f\u5426\u9700\u8981\u5206\u9694\u7b26"},"HAS_SEPARATOR_BY_NOT_PINYIN_AROUND - \u975e\u62fc\u97f3\u524d\u540e\u662f\u5426\u9700\u8981\u5206\u9694\u7b26"),(0,i.kt)("p",null,"\u5982\u679c\u9047\u5230\u975e\u6c49\u5b57\uff0c\u4f20\u53c2\u4e86\u5206\u9694\u7b26\u65f6\uff0c\u975e\u6c49\u5b57\u7684\u4e24\u4fa7\u662f\u5426\u9700\u8981\u6b64\u5206\u9694\u7b26\uff0c\u9ed8\u8ba4\u4e3a false\u3002"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-java"},'// \u8f93\u51fa\u7ed3\u679c\u4e3a h\u01ceo h\u01ceo xu\xe9 x\xed\uff0cti\u0101n ti\u0101n xi\xe0ng sh\xe0ng\uff0c\u53ef\u4ee5\u770b\u5230\u201c\uff0c\u201d\u7684\u4e24\u8fb9\u6ca1\u6709\u7a7a\u683c\nSystem.out.println(PinyinUtils.get("\u597d\u597d\u5b66\u4e60\uff0c\u5929\u5929\u5411\u4e0a", true, true, " "));\n\n// \u4e34\u65f6\u8bbe\u7f6e\u975e\u62fc\u97f3\u524d\u540e\u9700\u8981\u5206\u9694\u7b26\nPinyinFeature.setHasSeparatorByNotPinyinAround(true);\n// \u8f93\u51fa\u7ed3\u679c\u4e3a h\u01ceo h\u01ceo xu\xe9 x\xed \uff0c ti\u0101n ti\u0101n xi\xe0ng sh\xe0ng\nSystem.out.println(PinyinUtils.get("\u597d\u597d\u5b66\u4e60\uff0c\u5929\u5929\u5411\u4e0a", true, true, " "));\n')))}s.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[381],{5503:t=>{t.exports=JSON.parse('{"permalink":"/ZUtil/blog/tags/\u65f6\u533a","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[24],{3237:t=>{t.exports=JSON.parse('{"title":"date \u65f6\u95f4","description":"Date","slug":"/category/date-\u65f6\u95f4","permalink":"/ZUtil/docs/category/date-\u65f6\u95f4","navigation":{"previous":{"title":"\u53c2\u8003\u624b\u518c","permalink":"/ZUtil/docs/category/\u53c2\u8003\u624b\u518c"},"next":{"title":"constant \u5e38\u91cf","permalink":"/ZUtil/docs/reference-doc/date/constant"}}}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[687],{37:l=>{l.exports=JSON.parse('{"permalink":"/ZUtil/blog/tags/hello","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[529],{9058:(e,t,a)=>{a.d(t,{Z:()=>_});var l=a(7294),n=a(6010),r=a(7961),s=a(7524),o=a(9960),i=a(5999);const c="sidebar_re4s",m="sidebarItemTitle_pO2u",u="sidebarItemList_Yudw",d="sidebarItem__DBe",g="sidebarItemLink_mo7H",p="sidebarItemLinkActive_I1ZP";function h(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(c,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(m,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(u,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:d},l.createElement(o.Z,{isNavLink:!0,to:e.permalink,className:g,activeClassName:p},e.title)))))))}var E=a(3102);function f(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(o.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function b(e){return l.createElement(E.Zo,{component:f,props:e})}function v(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(b,{sidebar:t}):l.createElement(h,{sidebar:t}):null}function _(e){const{sidebar:t,toc:a,children:s,...o}=e,i=t&&t.items.length>0;return l.createElement(r.Z,o,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(v,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},390:(e,t,a)=>{a.d(t,{Z:()=>R});var l=a(7294),n=a(6010),r=a(9460),s=a(4996);function o(e){let{children:t,className:a}=e;const{frontMatter:n,assets:o}=(0,r.C)(),{withBaseUrl:i}=(0,s.C)(),c=o.image??n.image;return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},c&&l.createElement("meta",{itemProp:"image",content:i(c,{absolute:!0})}),t)}var i=a(9960);const c="title_f1Hy";function m(e){let{className:t}=e;const{metadata:a,isBlogPostPage:s}=(0,r.C)(),{permalink:o,title:m}=a,u=s?"h1":"h2";return l.createElement(u,{className:(0,n.Z)(c,t),itemProp:"headline"},s?m:l.createElement(i.Z,{itemProp:"url",to:o},m))}var u=a(5999),d=a(8824);const g="container_mt6G";function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function f(e){let{className:t}=e;const{metadata:a}=(0,r.C)(),{date:s,formattedDate:o,readingTime:i}=a;return l.createElement("div",{className:(0,n.Z)(g,"margin-vert--md",t)},l.createElement(h,{date:s,formattedDate:o}),void 0!==i&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:i})))}function b(e){return e.href?l.createElement(i.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:r,title:s,url:o,imageURL:i,email:c}=t,m=o||c&&`mailto:${c}`||void 0;return l.createElement("div",{className:(0,n.Z)("avatar margin-bottom--sm",a)},i&&l.createElement(b,{href:m,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:i,alt:r})),r&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(b,{href:m,itemProp:"url"},l.createElement("span",{itemProp:"name"},r))),s&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},s)))}const _="authorCol_Hf19",N="imageOnlyAuthorRow_pa_O",Z="imageOnlyAuthorCol_G86a";function P(e){let{className:t}=e;const{metadata:{authors:a},assets:s}=(0,r.C)();if(0===a.length)return null;const o=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,n.Z)("margin-top--md margin-bottom--sm",o?N:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,n.Z)(!o&&"col col--6",o?Z:_),key:t},l.createElement(v,{author:{...e,imageURL:s.authorsImageUrls[t]??e.imageURL}})))))}function k(){return l.createElement("header",null,l.createElement(m,null),l.createElement(f,null),l.createElement(P,null))}var T=a(8780),w=a(7654);function C(e){let{children:t,className:a}=e;const{isBlogPostPage:s}=(0,r.C)();return l.createElement("div",{id:s?T.blogPostContainerID:void 0,className:(0,n.Z)("markdown",a),itemProp:"articleBody"},l.createElement(w.Z,null,t))}var y=a(4881),B=a(1526),F=a(7462);function I(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function x(e){const{blogPostTitle:t,...a}=e;return l.createElement(i.Z,(0,F.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(I,null))}const L="blogPostFooterDetailsFull_mRVl";function M(){const{metadata:e,isBlogPostPage:t}=(0,r.C)(),{tags:a,title:s,editUrl:o,hasTruncateMarker:i}=e,c=!t&&i,m=a.length>0;return m||c||o?l.createElement("footer",{className:(0,n.Z)("row docusaurus-mt-lg",t&&L)},m&&l.createElement("div",{className:(0,n.Z)("col",{"col--9":c})},l.createElement(B.Z,{tags:a})),t&&o&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(y.Z,{editUrl:o})),c&&l.createElement("div",{className:(0,n.Z)("col text--right",{"col--3":m})},l.createElement(x,{blogPostTitle:s,to:e.permalink}))):null}function R(e){let{children:t,className:a}=e;const s=function(){const{isBlogPostPage:e}=(0,r.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(o,{className:(0,n.Z)(s,a)},l.createElement(k,null),l.createElement(C,null,t),l.createElement(M,null))}},4881:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(5999),r=a(5281),s=a(7462),o=a(6010);const i="iconEdit_Z9Sw";function c(e){let{className:t,...a}=e;return l.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(i,t),"aria-hidden":"true"},a),l.createElement("g",null,l.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function m(e){let{editUrl:t}=e;return l.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},l.createElement(c,null),l.createElement(n.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},2244:(e,t,a)=>{a.d(t,{Z:()=>s});var l=a(7294),n=a(6010),r=a(9960);function s(e){const{permalink:t,title:a,subLabel:s,isNext:o}=e;return l.createElement(r.Z,{className:(0,n.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},s&&l.createElement("div",{className:"pagination-nav__sublabel"},s),l.createElement("div",{className:"pagination-nav__label"},a))}},3008:(e,t,a)=>{a.d(t,{Z:()=>c});var l=a(7294),n=a(6010),r=a(9960);const s="tag_zVej",o="tagRegular_sFm0",i="tagWithCount_h2kH";function c(e){let{permalink:t,label:a,count:c}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(s,c?i:o)},a,c&&l.createElement("span",null,c))}},1526:(e,t,a)=>{a.d(t,{Z:()=>c});var l=a(7294),n=a(6010),r=a(5999),s=a(3008);const o="tags_jXut",i="tag_QGVx";function c(e){let{tags:t}=e;return l.createElement(l.Fragment,null,l.createElement("b",null,l.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),l.createElement("ul",{className:(0,n.Z)(o,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return l.createElement("li",{key:a,className:i},l.createElement(s.Z,{label:t,permalink:a}))}))))}},9460:(e,t,a)=>{a.d(t,{C:()=>o,n:()=>s});var l=a(7294),n=a(902);const r=l.createContext(null);function s(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const s=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return l.createElement(r.Provider,{value:s},t)}function o(){const e=(0,l.useContext)(r);if(null===e)throw new n.i6("BlogPostProvider");return e}},8824:(e,t,a)=>{a.d(t,{c:()=>c});var l=a(7294),n=a(2263);const r=["zero","one","two","few","many","other"];function s(e){return r.filter((t=>e.includes(t)))}const o={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function i(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),o}}),[e])}function c(){const e=i();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return l[Math.min(r,l.length-1)]}(a,t,e)}}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[762],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var d=n.createContext({}),c=function(e){var t=n.useContext(d),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(d.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,d=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=c(r),u=a,m=s["".concat(d,".").concat(u)]||s[u]||f[u]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[s]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},1558:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={},i="DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b",l={unversionedId:"reference-doc/date/dateUtils",id:"reference-doc/date/dateUtils",title:"DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b",description:"\u7ee7\u627forg.apache.commons.lang3.time.DateUtils\u3002",source:"@site/docs/003-reference-doc/date/002-dateUtils.md",sourceDirName:"003-reference-doc/date",slug:"/reference-doc/date/dateUtils",permalink:"/ZUtil/docs/reference-doc/date/dateUtils",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/date/002-dateUtils.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"constant \u5e38\u91cf",permalink:"/ZUtil/docs/reference-doc/date/constant"},next:{title:"DateFeature \u65f6\u95f4\u7279\u6027",permalink:"/ZUtil/docs/reference-doc/date/dateFeature"}},d={},c=[{value:"getFormatterBuilder",id:"getformatterbuilder",level:2},{value:"getStartDayOfWeekOfMonth",id:"getstartdayofweekofmonth",level:2},{value:"getEndDayOfWeekOfMonth",id:"getenddayofweekofmonth",level:2}],p={toc:c};function s(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"dateutils-\u65f6\u95f4\u5de5\u5177\u7c7b"},"DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b"),(0,a.kt)("p",null,"\u7ee7\u627f",(0,a.kt)("inlineCode",{parentName:"p"},"org.apache.commons.lang3.time.DateUtils"),"\u3002"),(0,a.kt)("p",null,"\u5927\u91cf\u4f7f\u7528 Java 8 \u65f6\u95f4\u7c7b\u578b\uff0c\u5373",(0,a.kt)("inlineCode",{parentName:"p"},"LocalDate"),"\u3001",(0,a.kt)("inlineCode",{parentName:"p"},"LocalTime"),"\u3001",(0,a.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u3001",(0,a.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u7b49\u3002"),(0,a.kt)("h2",{id:"getformatterbuilder"},"getFormatterBuilder"),(0,a.kt)("p",null,"\u83b7\u53d6\u65f6\u95f4\u683c\u5f0f\u5316\u6784\u9020\u5668\uff0c\u5373 ",(0,a.kt)("inlineCode",{parentName:"p"},"DateTimeFormatterBuilder"),"\u3002"),(0,a.kt)("p",null,"\u53ef\u4ee5\u6307\u5b9a\u683c\u5f0f\u548c\u65f6\u95f4\u7ea7\u522b\u7684\u9ed8\u8ba4\u503c\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'// \u4e0d\u5305\u542b\u5e74\u65f6\u83b7\u53d6\u5e74\u4f1a\u62a5\u9519\uff1aUnsupported field: Year\uff0c\u4f46\u662f\u8d4b\u503c\u4e86\u9ed8\u8ba4\u65f6\u95f4\u7ea7\u522b\u540e\u5c31\u4e0d\u4f1a\nMap<TemporalField, Long> fieldValueMap = new HashMap<>();\nfieldValueMap.put(ChronoField.YEAR, 0L);\nDateTimeFormatterBuilder formatterBuilder = DateUtils.getFormatterBuilder("MM-dd", fieldValueMap);\n')),(0,a.kt)("h2",{id:"getstartdayofweekofmonth"},"getStartDayOfWeekOfMonth"),(0,a.kt)("p",null,(0,a.kt)("img",{src:r(3941).Z,width:"673",height:"1044"})),(0,a.kt)("h2",{id:"getenddayofweekofmonth"},"getEndDayOfWeekOfMonth"),(0,a.kt)("p",null,(0,a.kt)("img",{src:r(3625).Z,width:"673",height:"1045"})))}s.isMDXComponent=!0},3625:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/DateUtils.getEndDayOfWeekOfMonth-0cdedb61c94ad99ffb7dc96ff5bf8065.png"},3941:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/DateUtils.getStartDayOfWeekOfMonth-42e1d575f87a192ad64fa9e8461bf8e3.png"}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[814],{837:e=>{e.exports=JSON.parse('{"permalink":"/ZUtil/blog/tags/zone","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[609],{5174:l=>{l.exports=JSON.parse('[{"label":"time","permalink":"/ZUtil/blog/tags/time","count":1},{"label":"zone","permalink":"/ZUtil/blog/tags/zone","count":1},{"label":"\u65f6\u533a","permalink":"/ZUtil/blog/tags/\u65f6\u533a","count":1},{"label":"\u65f6\u95f4","permalink":"/ZUtil/blog/tags/\u65f6\u95f4","count":1},{"label":"hello","permalink":"/ZUtil/blog/tags/hello","count":1}]')}}]);
\ No newline at end of file
(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[654],{3905:(e,t,n)=>{"use strict";n.d(t,{Zo:()=>u,kt:()=>f});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),i=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=i(e.components);return o.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=i(n),p=r,f=m["".concat(s,".").concat(p)]||m[p]||d[p]||a;return n?o.createElement(f,c(c({ref:t},u),{},{components:n})):o.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,c=new Array(a);c[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var i=2;i<a;i++)c[i]=n[i];return o.createElement.apply(null,c)}return o.createElement.apply(null,n)}p.displayName="MDXCreateElement"},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var o=n(7462),r=n(7294),a=n(6010),c=n(5999),l=n(6668),s=n(9960);const i="anchorWithStickyNavbar_LWe7",u="anchorWithHideOnScrollNavbar_WYt5";function m(e){let{as:t,id:n,...m}=e;const{navbar:{hideOnScroll:d}}=(0,l.L)();if("h1"===t||!n)return r.createElement(t,(0,o.Z)({},m,{id:void 0}));const p=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:n});return r.createElement(t,(0,o.Z)({},m,{className:(0,a.Z)("anchor",d?u:i,m.className),id:n}),m.children,r.createElement(s.Z,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p},"\u200b"))}},7654:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ye});var o=n(7294),r=n(3905),a=n(7462),c=n(5742);var l=n(2389),s=n(6010),i=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,i.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const h=/title=(?<quote>["'])(?<title>.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function b(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);default:return b(Object.keys(y),t)}}(o,r),l=n.split("\n"),s=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));i[t]?s[i[t]].range+=`${p},`:u[t]?s[u[t]].start=p:m[t]&&(s[m[t]].range+=`${s[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(s).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E="codeBlockContainer_Ckt0";function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,s.Z)(n.className,E,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,s.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var w=n(902);const B={attributes:!0,characterData:!0,childList:!0,subtree:!0};function T(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=B);const r=(0,w.zX)(t),a=(0,w.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const j={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var Z={Prism:n(7410).Z,theme:j};function L(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function O(){return O=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},O.apply(this,arguments)}var x=/\r\n|\r|\n/,S=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},_=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},P=function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=O({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=O({},n,{backgroundColor:null}),r};function z(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}const A=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),L(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?P(e.theme,e.language):void 0;return t.themeDict=n})),L(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=O({},z(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?O({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),L(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),L(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=O({},z(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?O({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),L(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],s=[l];c>-1;){for(;(a=o[c]++)<r[c];){var i=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],i=m):(u=_(u,m.type),m.alias&&(u=_(u,m.alias)),i=m.content),"string"==typeof i){var d=i.split(x),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)S(l),s.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(i),o.push(0),r.push(i.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return S(l),s}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component),I="codeLine_lJS_",M="codeLineNumber_Tfdd",D="codeLineContent_feaV";function H(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const i=c({line:t,className:(0,s.Z)(n,r&&I)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",i,r?o.createElement(o.Fragment,null,o.createElement("span",{className:M}),o.createElement("span",{className:D},u)):u,o.createElement("br",null))}var V=n(5999);const R={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function $(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,{target:t=document.body}={}){if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const n=document.createElement("textarea"),o=document.activeElement;n.value=e,n.setAttribute("readonly",""),n.style.contain="strict",n.style.position="absolute",n.style.left="-9999px",n.style.fontSize="12pt";const r=document.getSelection(),a=r.rangeCount>0&&r.getRangeAt(0);t.append(n),n.select(),n.selectionStart=0,n.selectionEnd=e.length;let c=!1;try{c=document.execCommand("copy")}catch{}n.remove(),a&&(r.removeAllRanges(),r.addRange(a)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,V.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,V.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,V.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,s.Z)("clean-btn",n,R.copyButton,r&&R.copyButtonCopied),onClick:l},o.createElement("span",{className:R.copyButtonIcons,"aria-hidden":"true"},o.createElement("svg",{className:R.copyButtonIcon,viewBox:"0 0 24 24"},o.createElement("path",{d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})),o.createElement("svg",{className:R.copyButtonSuccessIcon,viewBox:"0 0 24 24"},o.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))))}const W="wordWrapButtonIcon_Bwma",F="wordWrapButtonEnabled_EoeP";function q(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,V.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,s.Z)("clean-btn",t,r&&F),"aria-label":a,title:a},o.createElement("svg",{className:W,viewBox:"0 0 24 24","aria-hidden":"true"},o.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})))}function G(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:i}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=i??n.split(" ").find((e=>e.startsWith("language-")))?.replace(/language-/,"")??d;const g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return T(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=v(t,{metastring:r,language:f,magicComments:p}),w=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,s.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&o.createElement("div",{className:N.codeBlockTitle},b),o.createElement("div",{className:N.codeBlockContent},o.createElement(A,(0,a.Z)({},Z,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,s.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,s.Z)(N.codeBlockLines,w&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(H,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:w})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(q,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement($,{className:N.codeButton,code:C}))))}function U(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),s="string"==typeof c?G:C;return o.createElement(s,(0,a.Z)({key:String(r)},n),c)}var Y=n(9960);var Q=n(6043);const X="details_lb9f",J="isBrowser_bmU9",K="collapsibleContent_i85q";function ee(e){return!!e&&("SUMMARY"===e.tagName||ee(e.parentElement))}function te(e,t){return!!e&&(e===t||te(e.parentElement,t))}function ne(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),i=(0,o.useRef)(null),{collapsed:u,setCollapsed:m}=(0,Q.u)({initialState:!r.open}),[d,p]=(0,o.useState)(r.open),f=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,a.Z)({},r,{ref:i,open:d,"data-collapsed":u,className:(0,s.Z)(X,c&&J,r.className),onMouseDown:e=>{ee(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;ee(t)&&te(t,i.current)&&(e.preventDefault(),u?(m(!1),p(!0)):m(!0))}}),f,o.createElement(Q.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{m(e),p(!e)}},o.createElement("div",{className:K},n)))}const oe="details_b_Ee";function re(e){let{...t}=e;return o.createElement(ne,(0,a.Z)({},t,{className:(0,s.Z)("alert alert--info",oe,t.className)}))}var ae=n(2503);function ce(e){return o.createElement(ae.Z,e)}const le="containsTaskList_mC6p";const se="img_ev3q";const ie="admonition_LlT9",ue="admonitionHeading_tbUL",me="admonitionIcon_kALy",de="admonitionContent_S0QG";const pe={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:o.createElement(V.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:o.createElement(V.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:o.createElement(V.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:o.createElement(V.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:o.createElement(V.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},fe={secondary:"note",important:"info",success:"tip",warning:"danger"};function he(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const ge={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.Z,e,t)},code:function(e){const t=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(U,e)},a:function(e){return o.createElement(Y.Z,e)},pre:function(e){return o.createElement(U,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(re,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:(t=e.className,(0,s.Z)(t,t?.includes("contains-task-list")&&le))}));var t},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,s.Z)(t,se))}));var t},h1:e=>o.createElement(ce,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ce,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ce,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ce,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ce,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ce,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=he(e),c=function(e){const t=fe[e]??e,n=pe[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),pe.info)}(n),l=r??c.label,{iconComponent:i}=c,u=a??o.createElement(i,null);return o.createElement("div",{className:(0,s.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,ie)},o.createElement("div",{className:ue},o.createElement("span",{className:me},u),l),o.createElement("div",{className:de},t))},mermaid:n(1875).Z};function ye(e){let{children:t}=e;return o.createElement(r.Zo,{components:ge},t)}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[610],{9703:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(5999),r=a(2244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(r.Z,{permalink:s,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(9460),r=a(390);function s(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},1714:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(7294),l=a(6010),r=a(5999),s=a(8824),o=a(1944),i=a(5281),g=a(9960),c=a(9058),m=a(9703),u=a(197),p=a(9985);function d(e){const t=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,r.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,r.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function h(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(o.d,{title:a}),n.createElement(u.Z,{tag:"blog_tags_posts"}))}function b(e){let{tag:t,items:a,sidebar:l,listMetadata:s}=e;const o=d(t);return n.createElement(c.Z,{sidebar:l},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,o),n.createElement(g.Z,{href:t.allTagsPath},n.createElement(r.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(p.Z,{items:a}),n.createElement(m.Z,{metadata:s}))}function E(e){return n.createElement(o.FG,{className:(0,l.Z)(i.k.wrapper.blogPages,i.k.page.blogTagPostListPage)},n.createElement(h,e),n.createElement(b,e))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[220],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>N});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,a,i=function(e,t){if(null==e)return{};var n,a,i={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=a.createContext({}),m=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(p.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=m(n),d=i,N=s["".concat(p,".").concat(d)]||s[d]||c[d]||r;return n?a.createElement(N,l(l({ref:t},u),{},{components:n})):a.createElement(N,l({ref:t},u))}));function N(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[s]="string"==typeof e?e:i,l[1]=o;for(var m=2;m<r;m++)l[m]=n[m];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},4206:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>r,metadata:()=>o,toc:()=>m});var a=n(7462),i=(n(7294),n(3905));const r={},l="\u4e0d\u517c\u5bb9\u53d8\u66f4",o={unversionedId:"incompatible-changes",id:"incompatible-changes",title:"\u4e0d\u517c\u5bb9\u53d8\u66f4",description:"* 1.12.0",source:"@site/docs/999-incompatible-changes.md",sourceDirName:".",slug:"/incompatible-changes",permalink:"/ZUtil/docs/incompatible-changes",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/999-incompatible-changes.md",tags:[],version:"current",sidebarPosition:999,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"PinyinFeature \u62fc\u97f3\u7279\u6027",permalink:"/ZUtil/docs/reference-doc/pinyin/pinyinFeature"}},p={},m=[],u={toc:m};function s(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"\u4e0d\u517c\u5bb9\u53d8\u66f4"},"\u4e0d\u517c\u5bb9\u53d8\u66f4"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"1.12.0",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ClassUtils.isBasic"),"\u91cd\u547d\u540d\u4e3a",(0,i.kt)("inlineCode",{parentName:"li"},"isPrimitiveType"),"\u3002"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"BeanUtils"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"bean"),"\u5305\u4e0b\u3002"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"BeanUtils.FieldFunction"),"\u91cd\u547d\u540d\u4e3a",(0,i.kt)("inlineCode",{parentName:"li"},"PropertyFunction"),"\u5e76\u79fb\u81f3\u6839\u5305\u4e0b\u3002"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"BeanUtils.getFieldName(FieldFunction)"),"\u91cd\u547d\u540d\u4e3a",(0,i.kt)("inlineCode",{parentName:"li"},"getPropertyName(PropertyFunction)"),"\u3002"),(0,i.kt)("li",{parentName:"ul"},"\u5220\u9664",(0,i.kt)("inlineCode",{parentName:"li"},"BeanUtils.deepToMap"),"\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.11.0",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Group Id \u7531",(0,i.kt)("inlineCode",{parentName:"li"},"top.zhogjianhao"),"\u91cd\u547d\u540d\u4e3a",(0,i.kt)("inlineCode",{parentName:"li"},"top.csaf"),"\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.10.1",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"id.NanoIDUtils"),"\u91cd\u547d\u540d\u4e3a",(0,i.kt)("inlineCode",{parentName:"li"},"NanoIdUtils"),"\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.9.2",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"\u5220\u9664",(0,i.kt)("inlineCode",{parentName:"li"},"FileUtils.getClassRootPath"),"\uff1b"),(0,i.kt)("li",{parentName:"ul"},"\u5220\u9664",(0,i.kt)("inlineCode",{parentName:"li"},"FileUtils.getClassPath"),"\uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"FileUtils"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"io"),"\u5305\u4e0b\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.8.1",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"date.DateFeature"),"\u4e2d\u9759\u6001\u53d8\u91cf\u7684\u8d4b\u503c\u65b9\u5f0f\u7531\u76f4\u63a5\u8d4b\u503c\u6539\u4e3a\u901a\u8fc7",(0,i.kt)("inlineCode",{parentName:"li"},"set"),"\u3001",(0,i.kt)("inlineCode",{parentName:"li"},"setAlways"),"\u65b9\u6cd5\u8d4b\u503c\uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"DateUtils.defaultLocalDatePattern"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"DateConstant.DEFAULT_LOCAL_DATE_PATTERN"),"\uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"DateUtils.defaultLocalDateTimePattern"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"DateConstant.DEFAULT_LOCAL_DATE_TIME_PATTERN"),"\uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"DateUtils.defaultLocalTimePattern"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"DateConstant.DEFAULT_LOCAL_TIME_PATTERN"),"\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.8.0",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"date.DateDuration"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"date.constant"),"\u5305\u4e0b\uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"date.DatePattern"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"date.constant"),"\u5305\u4e0b\uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"date.DatePatternRegex"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"date.constant.DateRegexPattern")," \uff1b"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"constant.CommonPatternConstant"),"\u91cd\u547d\u540d\u4e3a",(0,i.kt)("inlineCode",{parentName:"li"},"PatternConstant"),";"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"RegExUtils"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"regex"),"\u5305\u4e0b\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.7.0",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"JsonUtils"),"\u7684",(0,i.kt)("inlineCode",{parentName:"li"},"toJson(Object, SerializerFeature...)"),"\u3001",(0,i.kt)("inlineCode",{parentName:"li"},"parseObject(String, Class<T>, Feature...)"),"\u3001",(0,i.kt)("inlineCode",{parentName:"li"},"parseObject(String, Class<T>, ParserConfig)"),"\u65b9\u6cd5\uff0cSerializerFeature... \u66ff\u6362\u4e3a ",(0,i.kt)("strong",{parentName:"li"},"JSONWriter.Feature..."),"\uff0cFeature... \u548c ParserConfig \u66ff\u6362\u4e3a ",(0,i.kt)("strong",{parentName:"li"},"JSONReader.Feature..."),"\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.5.1",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"\u5220\u9664",(0,i.kt)("inlineCode",{parentName:"li"},"ArrayUtils#indexOf(String[], String, int)"),"\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.2.4",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"DateUtils"),"\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"date"),"\u5305\u4e0b\u3002"))),(0,i.kt)("li",{parentName:"ul"},"1.2.0",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"CollectionUtils"),"\u7684",(0,i.kt)("inlineCode",{parentName:"li"},"moveForward\u3001remove"),"\u65b9\u6cd5\uff0c\u79fb\u81f3",(0,i.kt)("inlineCode",{parentName:"li"},"ArrayUtils"),"\u4e2d\u5e76\u91cd\u6784\u4f18\u5316\u3002")))))}s.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"java.time \u65f6\u533a\u8be6\u89e3","permalink":"/ZUtil/blog/javaTimeZone"},{"title":"\u6b22\u8fce","permalink":"/ZUtil/blog/welcome"}]}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[269],{5745:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[861],{6277:l=>{l.exports=JSON.parse('{"label":"\u65f6\u533a","permalink":"/ZUtil/blog/tags/\u65f6\u533a","allTagsPath":"/ZUtil/blog/tags","count":1}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[740],{4469:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u4ecb\u7ecd","href":"/ZUtil/docs/intro","docId":"intro"},{"type":"link","label":"\u5165\u95e8","href":"/ZUtil/docs/introduction","docId":"introduction"},{"type":"category","label":"\u53c2\u8003\u624b\u518c","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"date \u65f6\u95f4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"constant \u5e38\u91cf","href":"/ZUtil/docs/reference-doc/date/constant","docId":"reference-doc/date/constant"},{"type":"link","label":"DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b","href":"/ZUtil/docs/reference-doc/date/dateUtils","docId":"reference-doc/date/dateUtils"},{"type":"link","label":"DateFeature \u65f6\u95f4\u7279\u6027","href":"/ZUtil/docs/reference-doc/date/dateFeature","docId":"reference-doc/date/dateFeature"}],"href":"/ZUtil/docs/category/date-\u65f6\u95f4"},{"type":"category","label":"pinyin \u62fc\u97f3","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PinyinFeature \u62fc\u97f3\u7279\u6027","href":"/ZUtil/docs/reference-doc/pinyin/pinyinFeature","docId":"reference-doc/pinyin/pinyinFeature"}],"href":"/ZUtil/docs/category/pinyin-\u62fc\u97f3"}],"href":"/ZUtil/docs/category/\u53c2\u8003\u624b\u518c"},{"type":"link","label":"\u4e0d\u517c\u5bb9\u53d8\u66f4","href":"/ZUtil/docs/incompatible-changes","docId":"incompatible-changes"}]},"docs":{"incompatible-changes":{"id":"incompatible-changes","title":"\u4e0d\u517c\u5bb9\u53d8\u66f4","description":"* 1.12.0","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"\u4ecb\u7ecd","description":"\u7b80\u4ecb","sidebar":"tutorialSidebar"},"introduction":{"id":"introduction","title":"\u5165\u95e8","description":"\u5b89\u88c5","sidebar":"tutorialSidebar"},"reference-doc/date/constant":{"id":"reference-doc/date/constant","title":"constant \u5e38\u91cf","description":"DateConstant - \u65f6\u95f4\u5e38\u91cf","sidebar":"tutorialSidebar"},"reference-doc/date/dateFeature":{"id":"reference-doc/date/dateFeature","title":"DateFeature \u65f6\u95f4\u7279\u6027","description":"\u53ef\u4ee5\u901a\u8fc7\u4e34\u65f6\u6216\u603b\u662f\uff08Always\uff09\u4fee\u6539\u5176\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u6765\u51b3\u5b9a DateUtils \u4e2d\u65b9\u6cd5\u5bf9\u65f6\u95f4\u7684\u5904\u7406\u65b9\u5f0f\u3002","sidebar":"tutorialSidebar"},"reference-doc/date/dateUtils":{"id":"reference-doc/date/dateUtils","title":"DateUtils \u65f6\u95f4\u5de5\u5177\u7c7b","description":"\u7ee7\u627forg.apache.commons.lang3.time.DateUtils\u3002","sidebar":"tutorialSidebar"},"reference-doc/pinyin/pinyinFeature":{"id":"reference-doc/pinyin/pinyinFeature","title":"PinyinFeature \u62fc\u97f3\u7279\u6027","description":"\u53ef\u4ee5\u901a\u8fc7\u4e34\u65f6\u6216\u603b\u662f\uff08Always\uff09\u4fee\u6539\u5176\u9759\u6001\u6210\u5458\u53d8\u91cf\uff0c\u6765\u51b3\u5b9a PinyinUtils \u4e2d\u65b9\u6cd5\u5bf9\u62fc\u97f3\u7684\u5904\u7406\u65b9\u5f0f\u3002","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(7294),l=n(5999),o=n(1944),r=n(7961);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[236],{9648:l=>{l.exports=JSON.parse('{"label":"hello","permalink":"/ZUtil/blog/tags/hello","allTagsPath":"/ZUtil/blog/tags","count":1}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[608],{3169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(7294),l=a(9960),n=a(5999),c=a(1944),i=a(7961);function m(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function s(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(m,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),m=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(i.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,m.length>0&&r.createElement(s,{years:m}))))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[89],{46:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var n=a(7294),l=a(6010),r=a(2263),i=a(1944),o=a(5281),s=a(9058),c=a(9703),m=a(197),g=a(9985);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,r.Z)(),{blogDescription:l,blogTitle:o,permalink:s}=t,c="/"===s?a:o;return n.createElement(n.Fragment,null,n.createElement(i.d,{title:c,description:l}),n.createElement(m.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:l}=e;return n.createElement(s.Z,{sidebar:l},n.createElement(g.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function u(e){return n.createElement(i.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(p,e),n.createElement(d,e))}},9703:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),l=a(5999),r=a(2244);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),i&&n.createElement(r.Z,{permalink:i,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),l=a(9460),r=a(390);function i(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[391],{7060:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"javaTimeZone","metadata":{"permalink":"/ZUtil/blog/javaTimeZone","editUrl":"https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-29-java.time-zone/001-java.time_\u65f6\u533a\u8be6\u89e3.md","source":"@site/blog/2022-07-29-java.time-zone/001-java.time_\u65f6\u533a\u8be6\u89e3.md","title":"java.time \u65f6\u533a\u8be6\u89e3","description":"LocalDateTime\u7c7b\u662f\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7atZone\u65b9\u6cd5\u6765\u8bbe\u7f6eZoneId\uff0c\u8fd4\u56deZonedDateTime\u7c7b\u5b9e\u4f8b\uff0c\u901a\u8fc7atOffset\u65b9\u6cd5\u6765\u8bbe\u7f6eZoneOffset\uff0c\u8fd4\u56deOffsetDateTime\u7c7b\u5b9e\u4f8b\u3002","date":"2022-07-29T00:00:00.000Z","formattedDate":"2022\u5e747\u670829\u65e5","tags":[{"label":"time","permalink":"/ZUtil/blog/tags/time"},{"label":"zone","permalink":"/ZUtil/blog/tags/zone"},{"label":"\u65f6\u533a","permalink":"/ZUtil/blog/tags/\u65f6\u533a"},{"label":"\u65f6\u95f4","permalink":"/ZUtil/blog/tags/\u65f6\u95f4"}],"readingTime":15.125,"hasTruncateMarker":false,"authors":[{"name":"ZhongJianhao","title":"Maintainer of ZUtil","url":"https://github.com/duanluan","imageURL":"https://github.com/duanluan.png","key":"duanluan"}],"frontMatter":{"slug":"javaTimeZone","title":"java.time \u65f6\u533a\u8be6\u89e3","authors":["duanluan"],"tags":["time","zone","\u65f6\u533a","\u65f6\u95f4"]},"nextItem":{"title":"\u6b22\u8fce","permalink":"/ZUtil/blog/welcome"}},"content":"`LocalDateTime`\u7c7b\u662f\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7`atZone`\u65b9\u6cd5\u6765\u8bbe\u7f6e`ZoneId`\uff0c\u8fd4\u56de`ZonedDateTime`\u7c7b\u5b9e\u4f8b\uff0c\u901a\u8fc7`atOffset`\u65b9\u6cd5\u6765\u8bbe\u7f6e`ZoneOffset`\uff0c\u8fd4\u56de`OffsetDateTime`\u7c7b\u5b9e\u4f8b\u3002\\r\\n\\r\\n![](java.time.drawio.png)\\r\\n\\r\\n## ZonedDateTime \u7c7b\u6ce8\u91ca\u8be6\u89e3\\r\\n\\r\\n\u6211\u4eec\u6765\u9010\u6bb5\u89e3\u8bfb\u4e00\u4e0b ZonedDateTime \u7c7b\u7684\u6ce8\u91ca\u3002\\r\\n\\r\\n> A date-time with a time-zone in the ISO-8601 calendar system, such as `2007-12-03T10:15:30+01:00 Europe/Paris`.\\r\\n> \\r\\n> ISO-8601 \u65e5\u5386\u7cfb\u7edf\u4e2d\u5e26\u65f6\u533a\u7684\u65e5\u671f\u65f6\u95f4\uff0c\u4f8b\u5982`2007-12-03T10:15:30+01:00 Europe/Paris`\u3002\\r\\n\\r\\n[ISO-8601](https://zh.wikipedia.org/wiki/ISO_8601) \u6211\u4eec\u7b80\u5355\u7406\u89e3\u4e3a\u662f\u89c4\u5b9a\u65e5\u671f\u548c\u65f6\u95f4\u5982\u4f55\u8868\u793a\u7684\u6807\u51c6\u5373\u53ef\uff0c\u6b64\u5904\u4e0d\u6df1\u5165\u7814\u7a76\u3002\\r\\n\\r\\n`2007-12-03T10:15:30+01:00 Europe/Paris`\u4e2d\uff0c`2007-12-03`\u4e3a\u5e74\u6708\u65e5\uff1b`T`\u662f\u65e5\u671f\u548c\u65f6\u95f4\u7ec4\u5408\u8868\u793a\u65f6\u7684\u56fa\u5b9a\u5199\u6cd5\uff0c\u7528\u4e8e\u5206\u9694\uff1b`10:15:30`\u662f\u5c0f\u65f6\u5206\u949f\u79d2\uff1b`+01:00`\u662f\u6b64\u65e5\u671f\u65f6\u95f4\u4e0e UTC \u7684\u65f6\u5dee\u4e3a +1 \u5c0f\u65f6\uff0c\u5373**\u65f6\u533a\u504f\u79fb\uff08ZoneOffset\uff09**\uff1b`Europe/Paris`\u662f\u6307\u6b64\u65e5\u671f\u65f6\u95f4\u7684\u6240\u5728\u533a\u57df\u4e3a\u6b27\u6d32/\u5df4\u9ece\uff0c\u5373**\u65f6\u533a ID\uff08ZoneId\uff09**\uff0ctime-zone ID \u8bf7\u67e5\u770b\uff1a[List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)\u3002\\r\\n\\r\\n> ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value \\"2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone\\" can be stored in a `ZonedDateTime`.\\r\\n> \\r\\n> ZonedDateTime \u662f\u5e26\u65f6\u533a\u7684\u65e5\u671f\u65f6\u95f4\u7684\u5e38\u91cf\u8868\u793a\u3002\u6b64\u7c7b\u5b58\u50a8\u6240\u6709\u7684\u65e5\u671f\u65f6\u95f4\uff08\u7cbe\u786e\u5230\u7eb3\u79d2\uff09\u548c\u65f6\u533a\uff0c\u5176\u4e2d\u65f6\u533a\u504f\u79fb\u7528\u4e8e\u5904\u7406\u4e0d\u660e\u786e\u7684\u672c\u5730\u65e5\u671f\u65f6\u95f4\u3002 \u4f8b\u5982\uff0c\u503c\u201c2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone\u201d \u53ef\u4ee5\u88ab\u5b58\u50a8\u5728`ZonedDateTime`\u4e2d\u3002\\r\\n\\r\\n\u8bf4\u5b83\u662f\u5e38\u91cf\u662f\u56e0\u4e3a\u6b64\u7c7b\u662f\u88ab`final`\u4fee\u9970\u7684\uff0c\u8c03\u7528\u5b83\u7684\u65b9\u6cd5\u65f6\uff0c**\u8fd4\u56de**\u7684\u90fd\u662f**\u65b0\u5b9e\u4f8b**\u3002\\r\\n\\r\\n\u201c\u65f6\u533a\u504f\u79fb\u7528\u4e8e\u5904\u7406\u4e0d\u660e\u786e\u7684\u672c\u5730\u65e5\u671f\u65f6\u95f4\u201d\uff0c\u4e4b\u6240\u4ee5\u4e0d\u660e\u786e\uff0c\u662f\u56e0\u4e3a[\u590f\u4ee4\u65f6](https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6)\u7684\u5b58\u5728\uff0c\u540c\u4e00\u5730\u533a\uff0c\u4e0d\u540c\u6708\u4efd\uff0c\u751a\u81f3\u4e0d\u540c\u5e74\u4efd\u7684 ZoneOffset \u53ef\u80fd\u4e0d\u4e00\u6837\u3002\u8be6\u89c1[\u65f6\u533a\u4fe1\u606f\u6570\u636e\u5e93](https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93)\u3002\\r\\n\\r\\n```java\\r\\nLocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);\\r\\n// \u8bbe\u7f6e\u65f6\u533a ID \u4e3a \u7f8e\u56fd/\u7ebd\u7ea6\\r\\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(\\"America/New_York\\"));\\r\\n// \u8f93\u51fa\u4e3a -05:00\\r\\nSystem.out.println(zonedDateTime.getOffset());\\r\\n\\r\\n// \u8bbe\u7f6e\u6708\u4efd\u4e3a 4 \u6708\uff0c\u5373\u590f\u4ee4\u65f6\\r\\nzonedDateTime = zonedDateTime.withMonth(4);\\r\\n// \u8f93\u51fa\u4e3a -04:00\\r\\nSystem.out.println(zonedDateTime.getOffset());\\r\\n\\r\\n```\\r\\n\\r\\n> This class handles conversion from the local time-line of `LocalDateTime` to the instant time-line of `Instant`. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a `ZoneOffset`.\\r\\n> \\r\\n> \u6b64\u7c7b\u5904\u7406`LocalDateTime`\u7684\u672c\u5730\u65f6\u95f4\u7ebf\u5230`Instant`\u7684\u77ac\u65f6\u65f6\u95f4\u7ebf\u3002\u4e24\u6761\u65f6\u95f4\u7ebf\u7684\u5dee\u5f02\u662f\u4e0e UTC/Greenwich \u7684\u504f\u79fb\u91cf\uff0c\u7531`ZoneOffset`\u8868\u793a\u3002\\r\\n\\r\\n**Instant\uff08\u77ac\u65f6\uff09**\u7b80\u5355\u6765\u8bf4\u5c31\u662f java.time \u4e2d\u7684\u65f6\u95f4\u6233\uff08\u7cbe\u5ea6\u4e3a\u7eb3\u79d2\uff09\uff0c\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u3002\\r\\n\\r\\n\u6b64\u5904\u8bf4\u201c\u4e24\u6761\u65f6\u95f4\u7ebf\u7684\u5dee\u5f02\u662f\u4e0e UTC/Greenwich \u7684\u504f\u79fb\u91cf\u201d\u662f\u6307 Instant \u52a0\u4e0a ZoneOffset \u5c31\u53ef\u4ee5\u83b7\u53d6 LocalDateTime\u3002\u4f46\u5982\u679c\u662f\u8981\u5c06 Instant \u8f6c\u6362\u4e3a ZonedDateTime \u7684\u8bdd\uff0c\u9700\u8981\u8bbe\u7f6e ZoneId\u3002\\r\\n\\r\\n```java\\r\\nInstant instant = Instant.now();\\r\\nLocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();\\r\\nZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());\\r\\n```\\r\\n\\r\\n> Converting between the two time-lines involves calculating the offset using the [rules](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html) accessed from the `ZoneId`. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:\\r\\n> \\r\\n> * Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.\\r\\n> * Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from \\"winter\\" to \\"summer\\". In a gap there are local date-time values with no valid offset.\\r\\n> * Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from \\"summer\\" to \\"winter\\". In an overlap there are local date-time values with two valid offsets.\\r\\n>\\r\\n> \u4e24\u6761\u65f6\u95f4\u7ebf\u4e4b\u95f4\u7684\u8f6c\u6362\u6d89\u53ca\u5230\u4f7f\u7528`ZoneId`\u8bbf\u95ee[\u89c4\u5219](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html)\uff08ZoneRules\uff09\u8ba1\u7b97\u504f\u79fb\u91cf\u3002\u83b7\u53d6\u4e00\u4e2a instant \u7684\u504f\u79fb\u91cf\u5f88\u7b80\u5355\uff0c\u56e0\u4e3a\u6bcf\u4e2a instant \u6b63\u597d\u6709\u4e00\u4e2a\u6709\u6548\u504f\u79fb\u91cf\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u83b7\u53d6\u4e00\u4e2a local date-time \u7684\u6709\u6548\u504f\u79fb\u91cf\\r\\n\u5e76\u4e0d\u7b80\u5355\u3002\u6709\u4e09\u79cd\u60c5\u51b5\uff1a\\r\\n>\\r\\n> * \u6b63\u5e38\uff1a\u6709\u4e00\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u5728\u4e00\u5e74\u4e2d\u7684\u7edd\u5927\u591a\u6570\u65f6\u95f4\u91cc\uff0clocal date-time \u6709\u4e00\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\\r\\n> * \u95f4\u9699\uff1a\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u8fd9\u662f\u7531\u4e8e\u6625\u5b63\u590f\u4ee4\u65f6\u4ece\u201c\u51ac\u5b63\u201d\u5230\u201c\u590f\u5b63\u201d\uff0c\u65f6\u949f\u88ab\u8c03\u5feb\u4e86\uff0c\u8df3\u8fc7\u4e86\u4e00\u6bb5\u65f6\u95f4\u3002\u5728\u8df3\u8fc7\u7684\u95f4\u9699\u4e2d\uff0c\u6709 local date-time\uff0c\u4f46\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\\r\\n> * \u91cd\u53e0\uff1a\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u8fd9\u662f\u7531\u4e8e\u79cb\u5b63\u590f\u4ee4\u65f6\u4ece\u201c\u590f\u5b63\u201d\u5230\u201c\u51ac\u5b63\u201d\uff0c\u65f6\u949f\u5f80\u56de\u8c03\u4e86\u4e00\u6bb5\u65f6\u95f4\u3002\u5728\u91cd\u53e0\u7684\u60c5\u51b5\u4e0b\uff0c\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u7684 local date-time\u3002\\r\\n>\\r\\n> Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.\\r\\n> \\r\\n> For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically \\"summer\\" time.\\r\\n> \\r\\n> For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically \\"summer\\" time.. Two additional methods, [withEarlierOffsetAtOverlap()](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()) and [withLaterOffsetAtOverlap()](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()), help manage the case of an overlap.\\r\\n> \\r\\n> \u4efb\u4f55\u901a\u8fc7\u83b7\u53d6\u504f\u79fb\u91cf\u663e\u5f0f\u6216\u9690\u5f0f\u5730\u5c06 local date-time \u8f6c\u6362\u4e3a instant \u5730\u65b9\u90fd\u6709\u53ef\u80fd\u53d8\u5f97\u590d\u6742\u3002\\r\\n> \\r\\n> \u5bf9\u4e8e\u95f4\u9699\uff0c\u4e00\u822c\u7b56\u7565\u662f\uff0c\u5982\u679c local date-time \u843d\u5728\u95f4\u9699\u4e2d\u95f4\uff0c\u90a3\u4e48\u4ea7\u751f\u7684 zoned date-time \u662f local date-time \u5411\u524d\u79fb\u52a8\u95f4\u6b47\u7684\u957f\u5ea6\u540e\u7684\uff0c\u5bfc\u81f4\u65e5\u671f\u5728\u8f83\u665a\u7684\u504f\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u201c\u590f\u5b63\u201d\u65f6\u95f4\u3002\\r\\n>\\r\\n> \u5bf9\u4e8e\u91cd\u53e0\uff0c\u4e00\u822c\u7b56\u7565\u662f\uff0c\u5982\u679c local date-time \u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u90a3\u4e48\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u5c06\u88ab\u4fdd\u7559\u3002\u5982\u679c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\uff0c\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\uff0c\u90a3\u4e48\u5c31\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u201c\u590f\u5b63\u201d\u65f6\u95f4\u3002\u4e24\u4e2a\u989d\u5916\u7684\u65b9\u6cd5\uff0c[withEarlierOffsetAtOverlap()](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()) and [withLaterOffsetAtOverlap()](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap())\uff0c\u53ef\u4ee5\u5e2e\u52a9\u7ba1\u7406\u91cd\u5408\u7684\u60c5\u51b5\u3002\\r\\n>\\r\\n> In terms of design, this class should be viewed primarily as the combination of a `LocalDateTime` and a `ZoneId`. The `ZoneOffset` is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.\\r\\n>\\r\\n> \u5c31\u8bbe\u8ba1\u800c\u8a00\uff0c\u8fd9\u4e2a\u7c7b\u5e94\u8be5\u4e3b\u8981\u88ab\u770b\u4f5c\u662f`LocalDateTime`\u548c`ZoneId`\u7684\u7ec4\u5408\u3002`ZoneOffset`\u662f\u4e00\u4e2a\u91cd\u8981\u4f46\u6b21\u8981\u7684\u4fe1\u606f\uff0c\u7528\u6765\u786e\u4fdd\u8fd9\u4e2a\u7c7b\u4ee3\u8868\u4e00\u4e2a\u77ac\u95f4\uff0c\u7279\u522b\u662f\u5728\u590f\u4ee4\u65f6\u91cd\u53e0\u7684\u65f6\u5019\u3002\\r\\n\\r\\n\u6b64\u5904\u4e3e\u4f8b\uff0c\u7f8e\u56fd\u590f\u4ee4\u65f6\u4e00\u822c\u5728 **3 \u6708\u7b2c\u4e8c\u4e2a\u5468\u65e5 2AM** \u5f00\u59cb\uff0c\u5c06\u65f6\u949f\u62e8\u5feb 1 \u5c0f\u65f6\uff0c\u8c03\u5230 3 \u70b9\uff0c\u90a3\u8fd9\u4e00\u5c0f\u65f6\u5c31\u662f\u201c\u51ac\u5b63\u201d\u5230\u201c\u590f\u5b63\u201d\u7684**\u95f4\u9699\uff08Gap\uff09**\uff1b\u5728 **11 \u6708\u7b2c\u4e00\u4e2a\u5468\u65e5 2AM**\uff0c\u53c8\u4f1a\u5c06\u65f6\u949f\u62e8\u6162 1 \u5c0f\u65f6\uff0c\u8c03\u56de\u5230 1 \u70b9\uff0c\u90a3\u8fd9\u4e00\u5c0f\u65f6\u5c31\u662f\u201c\u590f\u5b63\u201d\u5230\u201c\u51ac\u5b63\u201d\u7684**\u91cd\u53e0\uff08Overlap\uff09**\u3002\\r\\n\\r\\n\\r\\n```java\\r\\nZoneId zoneId = ZoneId.of(\\"America/New_York\\");\\r\\nZoneRules zoneRules = zoneId.getRules();\\r\\n// \u7f8e\u56fd/\u7ebd\u7ea6 2022 \u5e74\u7684\u590f\u4ee4\u65f6\u95f4\u6b47\u65f6\u95f4\u4e3a 03-13 02:00 ~ 03:00\uff08\u4e0d\u5305\u542b 03:00\uff09\\r\\nLocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);\\r\\nZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);\\r\\nSystem.out.println(zoneRulesTransition);\\r\\nSystem.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));\\r\\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u95f4\u6b47\u4e2d\u95f4\uff0c\u90a3\u5bf9\u5e94\u7684 zoned date-time \u4f1a\u52a0\u4e0a\u95f4\u6b47\u957f\u5ea6\uff08\u6b64\u5904\u4e3a 1 \u5c0f\u65f6\uff09\uff0c\u540c\u65f6\u65f6\u533a\u504f\u79fb\u91cf\u4e3a\u590f\u4ee4\u65f6\u504f\u79fb\u91cf\u3002\\r\\nSystem.out.println(localDateTime.atZone(zoneId));\\r\\n\\r\\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\\r\\nTransition[Gap at 2022-03-13T02:00-05:00 to -04:00]\\r\\nnull\\r\\n2022-03-13T03:30-04:00[America/New_York]\\r\\n```\\r\\n\\r\\n\u8bf4\u201c\u95f4\u6b47\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u201d\uff0c\u662f\u56e0\u4e3a\u843d\u5728\u95f4\u6b47\u518d\u8f6c\u6362\u4e3a zoned date-time \u540e\uff0c\u4f1a\u81ea\u52a8\u52a0\u4e0a\u95f4\u6b47\u957f\u5ea6\uff0c\u6240\u4ee5\u90a3\u6bb5\u65f6\u95f4\u53ea\u6709 local date-time\uff0c\u6ca1\u6709\u504f\u79fb\u91cf\u3002\\r\\n\\r\\n```java\\r\\nZoneId zoneId = ZoneId.of(\\"America/New_York\\");\\r\\nZoneRules zoneRules = zoneId.getRules();\\r\\n// \u7f8e\u56fd/\u7ebd\u7ea6 2022 \u5e74\u7684\u590f\u4ee4\u65f6\u91cd\u53e0\u65f6\u95f4\u4e3a 11-06 01:00 ~ 02:00\uff08\u4e0d\u5305\u542b 02:00\uff09\\r\\nLocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);\\r\\nZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);\\r\\nSystem.out.println(zoneRulesTransition);\\r\\nSystem.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));\\r\\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff0c\u5373\u590f\u4ee4\u65f6\u504f\u79fb\u91cf -04:00\\r\\nSystem.out.println(localDateTime.atZone(zoneId));\\r\\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u4ee5\u524d\u6709\u504f\u79fb\u91cf\u4e14\u66f4\u665a\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u665a\u7684\u504f\u79fb\u91cf\uff0c\u5373\u975e\u590f\u4ee4\u65f6\u504f\u79fb\u91cf -05:00\\r\\nSystem.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));\\r\\n\\r\\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\\r\\nTransition[Overlap at 2022-11-06T02:00-04:00 to -05:00]\\r\\nnull\\r\\n2022-11-06T01:30-04:00[America/New_York]\\r\\n2022-11-06T02:30-05:00[America/New_York]\\r\\n```\\r\\n\\r\\n\u8bf4\u201c\u91cd\u53e0\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u201d\uff0c\u662f\u56e0\u4e3a\u843d\u5728\u91cd\u53e0\u65f6\uff0c\u5982\u679c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff1b\u5982\u679c\u4ee5\u524d\u6709\u504f\u79fb\u91cf\u4e14\u66f4\u665a\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u665a\u7684\u504f\u79fb\u91cf\u3002\\r\\n\\r\\n> This is a [value-based](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html) class; use of identity-sensitive operations (including reference equality (`==`), identity hash code, or synchronization) on instances of `ZonedDateTime` may have unpredictable results and should be avoided. The `equals` method should be used for comparisons.\\r\\n> \\r\\n> \u8fd9\u662f\u4e00\u4e2a [value-based](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html) \u7c7b\uff1b\u5728`ZonedDateTime`\u7684\u5b9e\u4f8b\u4e0a\u4f7f\u7528 identity-sensitive \u7684\u64cd\u4f5c\uff08\u5305\u62ec\u5f15\u7528\u76f8\u7b49`==`\u3001identity hash code \u6216\u540c\u6b65 synchronization\uff09\u53ef\u80fd\u4f1a\u4ea7\u751f\u4e0d\u53ef\u9884\u6d4b\u7684\u7ed3\u679c\uff0c\u6240\u4ee5\u8981\u907f\u514d\u3002\u5e94\u8be5\u4f7f\u7528 equals \u65b9\u6cd5\u6765\u8fdb\u884c\u6bd4\u8f83\u3002\\r\\n> \\r\\n> A `ZonedDateTime` holds state equivalent to three separate objects, a `LocalDateTime`, a `ZoneId` and the resolved `ZoneOffset`. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.\\r\\n> \\r\\n> \u4e00\u4e2a`ZonedDateTime`\u76f8\u5f53\u4e8e\u6301\u6709\u4e09\u4e2a\u72ec\u7acb\u5bf9\u8c61\u7684\u72b6\u6001\uff0c\u4e00\u4e2a`LocalDateTime`\uff0c\u4e00\u4e2a`ZoneId`\u548c\u5df2\u89e3\u51b3\u7684`ZoneOffset`\u3002\u5fc5\u8981\u65f6\uff0c\u504f\u79fb\u91cf\u548c local date-time \u88ab\u7528\u6765\u5b9a\u4e49\u4e00\u4e2a\u77ac\u95f4\u3002zone ID \u88ab\u7528\u6765\u83b7\u53d6\u504f\u79fb\u91cf\u53ca\u4f55\u65f6\u53d8\u5316\u7684\u89c4\u5219\u3002\u504f\u79fb\u91cf\u4e0d\u80fd\u81ea\u7531\u8bbe\u7f6e\uff0c\u56e0\u4e3a\u65f6\u533a\u63a7\u5236\u7740\u54ea\u4e9b\u504f\u79fb\u91cf\u65f6\u6709\u6548\u7684\u3002\\r\\n> \\r\\n> This class is immutable and thread-safe.\\r\\n> \\r\\n> \u8fd9\u4e2a\u7c7b\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u5e76\u4e14\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002\\r\\n\\r\\n## withZoneSameLocal \u548c withZoneSameInstant \u7684\u4f7f\u7528\u4e0e\u533a\u522b\\r\\n\\r\\n### withZoneSameLocal \u7b80\u4ecb\\r\\n\\r\\n\u5148\u770b `withZoneSameLocal` \u65b9\u6cd5\u7684\u6ce8\u91ca\uff1a\\r\\n\\r\\n> Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.\\r\\n> \\r\\n> This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as [ofLocal(LocalDateTime, ZoneId, ZoneOffset)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)).\\r\\n>\\r\\n> To change the zone and adjust the local date-time, use [withZoneSameInstant(ZoneId)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)).\\r\\n> \\r\\n> This instance is immutable and unaffected by this method call.\\r\\n> \\r\\n> `@param` `zone` \u2013 the time-zone to change to, not null\\r\\n>\\r\\n> `@return` a `ZonedDateTime` based on this date-time with the requested zone, not null\\r\\n> \\r\\n> \u8fd4\u56de\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u65f6\u533a\u7684 date-time \u7684\u526f\u672c\uff0c\u5982\u679c\u53ef\u80fd\u7684\u8bdd\uff0c\u4fdd\u7559 local date-time\u3002\\r\\n> \\r\\n> \u8fd9\u4e2a\u65b9\u6cd5\u6539\u53d8\u4e86\u65f6\u533a\u5e76\u4fdd\u7559\u4e86 local date-time\u3002\u5728\u65b0\u7684\u65f6\u533a\u65e0\u6548\u65f6\uff0clocal date-time \u624d\u4f1a\u88ab\u6539\u53d8\uff0c\u4e0e\u4f7f\u7528 [ofLocal(LocalDateTime, ZoneId, ZoneOffset)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)) \u65b9\u6cd5\u76f8\u540c\u3002\\r\\n> \\r\\n> \u8981\u6539\u53d8\u533a\u57df\u5e76\u8c03\u6574 local date-time\uff0c\u8bf7\u4f7f\u7528 [withZoneSameInstant(ZoneId)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId))\u3002\\r\\n> \\r\\n> \u88ab\u8c03\u7528\u5b9e\u4f8b\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u4e0d\u53d7\u6b64\u65b9\u6cd5\u8c03\u7528\u7684\u5f71\u54cd\u3002\\r\\n> \\r\\n> `\u5f62\u53c2`\uff1azone - \u8981\u6539\u53d8\u7684\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002\\r\\n> \\r\\n> `\u8fd4\u56de\u503c`\uff1aa ZonedDateTime - \u57fa\u4e8e\u8be5 date-time \u7684\u8bf7\u6c42\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002\\r\\n\\r\\n\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u4fee\u6539\u65f6\u533a\u4f46\u662f\u4fdd\u6301 local date-time \u4e0d\u53d8\uff1a\\r\\n\\r\\n\\r\\n```java\\r\\nLocalDateTime localDateTime = LocalDateTime.now();\\r\\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(\\"Asia/Shanghai\\"));\\r\\nSystem.out.println(zonedDateTime);\\r\\nSystem.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(\\"Europe/Moscow\\")));\\r\\n\\r\\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\\r\\n2022-08-08T18:45:22.711+08:00[Asia/Shanghai]\\r\\n2022-08-08T18:45:22.711+03:00[Europe/Moscow]\\r\\n```\\r\\n\\r\\n### withZoneSameInstant \u7b80\u4ecb\\r\\n\\r\\n\u518d\u770b `withZoneSameInstant` \u65b9\u6cd5\u6ce8\u91ca\uff1a\\r\\n\\r\\n> Returns a copy of this date-time with a different time-zone, retaining the instant.\\r\\n>\\r\\n> This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.\\r\\n> \\r\\n> This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.\\r\\n> \\r\\n> To change the offset while keeping the local time, use [withZoneSameLocal(ZoneId)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)).\\r\\n> \\r\\n> `@param` `zone` \u2013 the time-zone to change to, not null\\r\\n>\\r\\n> `@return` a `ZonedDateTime` based on this date-time with the requested zone, not null\\r\\n> \\r\\n> `@throws` [DateTimeException](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html) \u2013 if the result exceeds the supported date range\\r\\n>\\r\\n> \u8fd4\u56de\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u65f6\u533a\u7684 date-time \u7684\u526f\u672c\uff0c\u4fdd\u7559 instant\u3002\\r\\n> \\r\\n> \u8fd9\u4e2a\u65b9\u6cd5\u6539\u53d8\u4e86\u65f6\u533a\u5e76\u4fdd\u7559\u4e86 instant\u3002\u8fd9\u901a\u5e38\u4f1a\u5bfc\u81f4 local date-time \u7684\u6539\u53d8\u3002\\r\\n> \\r\\n> \u8fd9\u4e2a\u65b9\u6cd5\u662f\u57fa\u4e8e\u4fdd\u7559\u76f8\u540c\u7684 instant\uff0c\u56e0\u6b64\u672c\u5730\u65f6\u95f4\u7ebf\u7684\u95f4\u6b47\u548c\u91cd\u53e0\u5bf9\u7ed3\u679c\u6ca1\u6709\u5f71\u54cd\u3002\\r\\n> \\r\\n> \u8981\u4fdd\u6301 local date-time \u7684\u540c\u65f6\u6539\u53d8\u504f\u79fb\u91cf\uff0c\u8bf7\u4f7f\u7528 [withZoneSameLocal(ZoneId)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId))\u3002\\r\\n> \\r\\n> `\u5f62\u53c2`\uff1a`zone` - \u8981\u6539\u53d8\u7684\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002\\r\\n> \\r\\n> `\u8fd4\u56de\u503c`\uff1aa `ZonedDateTime` - \u57fa\u4e8e\u8be5 date-time \u7684\u8bf7\u6c42\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002\\r\\n> \\r\\n> `\u629b\u51fa`\uff1a[DateTimeException](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html) \u2013 \u5982\u679c\u7ed3\u679c\u8d85\u51fa\u4e86\u652f\u6301\u7684\u65e5\u671f\u8303\u56f4\u3002\\r\\n\\r\\n\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u4fee\u6539\u65f6\u533a\u4f46\u662f\u4fdd\u6301 instant \u4e0d\u53d8\u3002\u56e0\u4e3a\u65f6\u533a\u53d8\u4e86\uff0c\u504f\u79fb\u91cf\u80af\u5b9a\u53d8\u4e86\uff0c\u6240\u4ee5 local date-time \u4e5f\u4f1a\u6539\u53d8\u4ee5\u4fdd\u6301 instant \u4e0d\u53d8\u3002\\r\\n\\r\\n```java\\r\\nLocalDateTime localDateTime = LocalDateTime.now();\\r\\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(\\"Asia/Shanghai\\"));\\r\\nSystem.out.println(zonedDateTime);\\r\\nSystem.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(\\"Europe/Moscow\\")));\\r\\n\\r\\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\\r\\n2022-08-09T20:06:35.753+08:00[Asia/Shanghai]\\r\\n2022-08-09T15:06:35.753+03:00[Europe/Moscow]\\r\\n```\\r\\n\\r\\n## \u2026\u2026\\r\\n\\r\\n## \u7591\u95ee\\r\\n\\r\\n\u6211\u4e86\u89e3\u7684\u5e76\u4e0d\u5168\u9762\uff0c\u6216\u8005\u662f\u56e0\u4e3a\u82f1\u8bed\u80fd\u529b\u6709\u9650\uff0c\u539f\u672c\u8981\u548c\u4e0a\u4e0b\u6587\u5173\u8054\u7406\u89e3\u7684\u5730\u65b9\u6ca1\u7ffb\u8bd1\u597d\uff0c\u5bfc\u81f4\u6211\u6709\u4ee5\u4e0b\u7591\u95ee\u3002\u5982\u679c\u4f60\u77e5\u9053\uff0c\u6b22\u8fce\u8054\u7cfb\u6211\uff01\\r\\n\\r\\n* \u6587\u4e2d\u201cor the previous offset is invalid\u201d\u3001\u201cThe local date-time is only changed if it is invalid for the new zone\u201d\u8fd9\u4e24\u6bb5\u8bdd\u7684\u65e0\u6548\u504f\u79fb\u91cf\u3001\u65f6\u533a\u5177\u4f53\u6307\u7684\u662f\u4ec0\u4e48\uff1f\\r\\n\\r\\n## \u53c2\u8003\\r\\n\\r\\n* [\u65f6\u533a\u4fe1\u606f\u6570\u636e\u5e93 - \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66](https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93)\\r\\n* [List of tz database time zones - Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)\\r\\n* [\u590f\u4ee4\u65f6 - \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66](https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6)"},{"id":"welcome","metadata":{"permalink":"/ZUtil/blog/welcome","editUrl":"https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-16-welcome/index.md","source":"@site/blog/2022-07-16-welcome/index.md","title":"\u6b22\u8fce","description":"Hello, World!","date":"2022-07-16T00:00:00.000Z","formattedDate":"2022\u5e747\u670816\u65e5","tags":[{"label":"hello","permalink":"/ZUtil/blog/tags/hello"}],"readingTime":0.405,"hasTruncateMarker":false,"authors":[{"name":"ZhongJianhao","title":"Maintainer of ZUtil","url":"https://github.com/duanluan","imageURL":"https://github.com/duanluan.png","key":"duanluan"}],"frontMatter":{"slug":"welcome","title":"\u6b22\u8fce","authors":["duanluan"],"tags":["hello"]},"prevItem":{"title":"java.time \u65f6\u533a\u8be6\u89e3","permalink":"/ZUtil/blog/javaTimeZone"}},"content":"Hello, World!\\r\\n\\r\\n\u6b22\u8fce\u8bbf\u95ee\u6211\u7684\u535a\u5ba2\uff1a[\u6b32\u7a77\u4e09\u5343\u754c\u7684\u535a\u5ba2](http://blog.zhjh.top/)\\r\\n\\r\\n# \u66f4\u5feb\\r\\n\\r\\n\u4ee5\u4e0b\u5217\u51fa\u90e8\u5206\uff08\u5c01\u88c5\u7b2c\u4e09\u65b9\u7684\u4e0d\u5217\uff09\u548c hutool\uff085.8+\uff09\u7684 JMH \u5bf9\u6bd4\u6d4b\u8bd5\uff08\u4ec5\u541e\u5410\u91cf\uff0c\u5176\u4ed6\u8bf7\u67e5\u770b\u6e90\u7801\uff09\uff0c\u683c\u5f0f\u4e3a\uff1aZUtil \u541e\u5410\u91cf / hutool \u541e\u5410\u91cf = \u5feb\u591a\u5c11\u500d\\r\\n\\r\\n* \u5b57\u7b26\u4e32\u8f6c\u62fc\u97f3\uff1a8.944 / 2.636 = 3.39"}]}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[588],{8235:e=>{e.exports=JSON.parse('{"title":"\u53c2\u8003\u624b\u518c","description":"Reference Doc","slug":"/category/\u53c2\u8003\u624b\u518c","permalink":"/ZUtil/docs/category/\u53c2\u8003\u624b\u518c","navigation":{"previous":{"title":"\u5165\u95e8","permalink":"/ZUtil/docs/introduction"},"next":{"title":"date \u65f6\u95f4","permalink":"/ZUtil/docs/category/date-\u65f6\u95f4"}}}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[755],{9605:l=>{l.exports=JSON.parse('{"label":"time","permalink":"/ZUtil/blog/tags/time","allTagsPath":"/ZUtil/blog/tags","count":1}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[286],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(r),f=o,d=s["".concat(u,".").concat(f)]||s[f]||m[f]||l;return r?n.createElement(d,a(a({ref:t},p),{},{components:r})):n.createElement(d,a({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,a=new Array(l);a[0]=f;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:o,a[1]=i;for(var c=2;c<l;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},6886:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const l={slug:"welcome",title:"\u6b22\u8fce",authors:["duanluan"],tags:["hello"]},a=void 0,i={permalink:"/ZUtil/blog/welcome",editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-16-welcome/index.md",source:"@site/blog/2022-07-16-welcome/index.md",title:"\u6b22\u8fce",description:"Hello, World!",date:"2022-07-16T00:00:00.000Z",formattedDate:"2022\u5e747\u670816\u65e5",tags:[{label:"hello",permalink:"/ZUtil/blog/tags/hello"}],readingTime:.405,hasTruncateMarker:!1,authors:[{name:"ZhongJianhao",title:"Maintainer of ZUtil",url:"https://github.com/duanluan",imageURL:"https://github.com/duanluan.png",key:"duanluan"}],frontMatter:{slug:"welcome",title:"\u6b22\u8fce",authors:["duanluan"],tags:["hello"]},prevItem:{title:"java.time \u65f6\u533a\u8be6\u89e3",permalink:"/ZUtil/blog/javaTimeZone"}},u={authorsImageUrls:[void 0]},c=[],p={toc:c};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Hello, World!"),(0,o.kt)("p",null,"\u6b22\u8fce\u8bbf\u95ee\u6211\u7684\u535a\u5ba2\uff1a",(0,o.kt)("a",{parentName:"p",href:"http://blog.zhjh.top/"},"\u6b32\u7a77\u4e09\u5343\u754c\u7684\u535a\u5ba2")),(0,o.kt)("h1",{id:"\u66f4\u5feb"},"\u66f4\u5feb"),(0,o.kt)("p",null,"\u4ee5\u4e0b\u5217\u51fa\u90e8\u5206\uff08\u5c01\u88c5\u7b2c\u4e09\u65b9\u7684\u4e0d\u5217\uff09\u548c hutool\uff085.8+\uff09\u7684 JMH \u5bf9\u6bd4\u6d4b\u8bd5\uff08\u4ec5\u541e\u5410\u91cf\uff0c\u5176\u4ed6\u8bf7\u67e5\u770b\u6e90\u7801\uff09\uff0c\u683c\u5f0f\u4e3a\uff1aZUtil \u541e\u5410\u91cf / hutool \u541e\u5410\u91cf = \u5feb\u591a\u5c11\u500d"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5b57\u7b26\u4e32\u8f6c\u62fc\u97f3\uff1a8.944 / 2.636 = 3.39")))}s.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[282],{497:l=>{l.exports=JSON.parse('{"label":"\u65f6\u95f4","permalink":"/ZUtil/blog/tags/\u65f6\u95f4","allTagsPath":"/ZUtil/blog/tags","count":1}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[443],{8995:t=>{t.exports=JSON.parse('{"permalink":"/ZUtil/blog/tags/time","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[103],{5203:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});var a=n(7294),l=n(6010),r=n(1944),o=n(5281),i=n(9460),c=n(9058),s=n(390),m=n(7462),d=n(5999),u=n(2244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,d.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(u.Z,(0,m.Z)({},n,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(u.Z,(0,m.Z)({},t,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:l,date:o,tags:c,authors:s,frontMatter:m}=t,{keywords:d}=m,u=e.image??m.image;return a.createElement(r.d,{title:n,description:l,keywords:d,image:u},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:o}),s.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:s.map((e=>e.url)).filter(Boolean).join(",")}),c.length>0&&a.createElement("meta",{property:"article:tag",content:c.map((e=>e.label)).join(",")}))}var v=n(9407);function p(e){let{sidebar:t,children:n}=e;const{metadata:l,toc:r}=(0,i.C)(),{nextItem:o,prevItem:m,frontMatter:d}=l,{hide_table_of_contents:u,toc_min_heading_level:f,toc_max_heading_level:p}=d;return a.createElement(c.Z,{sidebar:t,toc:!u&&r.length>0?a.createElement(v.Z,{toc:r,minHeadingLevel:f,maxHeadingLevel:p}):void 0},a.createElement(s.Z,null,n),(o||m)&&a.createElement(g,{nextItem:o,prevItem:m}))}function h(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(r.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogPostPage)},a.createElement(f,null),a.createElement(p,{sidebar:e.sidebar},a.createElement(t,null))))}},3743:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(7462),l=n(7294),r=n(6668);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,r.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,l.useRef)(void 0),n=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:o}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:o}),c=s(i,{anchorTopOffset:n.current}),m=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=l.memo(u);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...f}=e;const v=(0,r.L)(),p=m??v.tableOfContents.minHeadingLevel,h=u??v.tableOfContents.maxHeadingLevel,b=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:h});return d((0,l.useMemo)((()=>{if(c&&s)return{linkClassName:c,linkActiveClassName:s,minHeadingLevel:p,maxHeadingLevel:h}}),[c,s,p,h])),l.createElement(g,(0,a.Z)({toc:b,className:n,linkClassName:c},f))}},9407:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(7462),l=n(7294),r=n(6010),o=n(3743);const i="tableOfContents_bqdL";function c(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(i,"thin-scrollbar",t)},l.createElement(o.Z,(0,a.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[122],{3769:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[100],{3905:(t,e,r)=>{r.d(e,{Zo:()=>p,kt:()=>d});var n=r(7294);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function i(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?o(Object(r),!0).forEach((function(e){a(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function l(t,e){if(null==t)return{};var r,n,a=function(t,e){if(null==t)return{};var r,n,a={},o=Object.keys(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||(a[r]=t[r]);return a}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}var c=n.createContext({}),u=function(t){var e=n.useContext(c),r=e;return t&&(r="function"==typeof t?t(e):i(i({},e),t)),r},p=function(t){var e=u(t.components);return n.createElement(c.Provider,{value:e},t.children)},s="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},f=n.forwardRef((function(t,e){var r=t.components,a=t.mdxType,o=t.originalType,c=t.parentName,p=l(t,["components","mdxType","originalType","parentName"]),s=u(r),f=a,d=s["".concat(c,".").concat(f)]||s[f]||m[f]||o;return r?n.createElement(d,i(i({ref:e},p),{},{components:r})):n.createElement(d,i({ref:e},p))}));function d(t,e){var r=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var o=r.length,i=new Array(o);i[0]=f;var l={};for(var c in e)hasOwnProperty.call(e,c)&&(l[c]=e[c]);l.originalType=t,l[s]="string"==typeof t?t:a,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},3274:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const o={},i="\u4ecb\u7ecd",l={unversionedId:"intro",id:"intro",title:"\u4ecb\u7ecd",description:"\u7b80\u4ecb",source:"@site/docs/001-intro.md",sourceDirName:".",slug:"/intro",permalink:"/ZUtil/docs/intro",draft:!1,editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/docs/001-intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",next:{title:"\u5165\u95e8",permalink:"/ZUtil/docs/introduction"}},c={},u=[{value:"\u7b80\u4ecb",id:"\u7b80\u4ecb",level:2},{value:"\u8d44\u6e90",id:"\u8d44\u6e90",level:2}],p={toc:u};function s(t){let{components:e,...r}=t;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u4ecb\u7ecd"},"\u4ecb\u7ecd"),(0,a.kt)("h2",{id:"\u7b80\u4ecb"},"\u7b80\u4ecb"),(0,a.kt)("p",null,"\u8ffd\u6c42\u66f4\u5feb\u66f4\u5168\u7684 Java \u5de5\u5177\u7c7b\u3002"),(0,a.kt)("p",null,"\u672c\u6587\u6863\u53ea\u4f1a\u4ecb\u7ecd\u5e38\u7528\u53ca\u7279\u8272\u529f\u80fd\uff0c\u5177\u4f53\u4f7f\u7528\u8bf7\u67e5\u770b ",(0,a.kt)("a",{parentName:"p",href:"https://apidoc.gitee.com/duanluan/ZUtil"},"javadoc"),"\u3002"),(0,a.kt)("p",null,"\u548c Hutool \u7684\u6027\u80fd\u5bf9\u6bd4\u6d4b\u8bd5\u53ef\u4ee5\u67e5\u770b ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/jmh/contrast"},"jmh.contrast"),"\u3002"),(0,a.kt)("h2",{id:"\u8d44\u6e90"},"\u8d44\u6e90"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/duanluan/ZUtil/discussions"},"GitHub Discussions")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://gitee.com/duanluan/ZUtil"},"Gitee"),"\uff08\u4ed3\u5e93\u8bc4\u8bba\u5373\u53ef\uff09"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://jq.qq.com/?_wv=1027&k=Jzpzg0lc"},"QQ \u7fa4")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://segmentfault.com/search?q=zutil&type=qa"},"SegmentFault \u95ee\u7b54"),"\uff08",(0,a.kt)("a",{parentName:"li",href:"https://segmentfault.com/u/duanluan"},"\u5173\u6ce8\u540e\u63d0\u95ee\u9898\u65f6\u9080\u8bf7\u56de\u7b54"),"\uff09"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.oschina.net/search?scope=bbs&q=zutil"},"\u5f00\u6e90\u4e2d\u56fd\u95ee\u7b54"),"\uff08",(0,a.kt)("a",{parentName:"li",href:"https://www.oschina.net/question/ask?user=2353983"},"\u5411\u6211\u63d0\u95ee"),"\uff09"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://so.csdn.net/so/search?q=zutil&t=ask"},"CSDN \u95ee\u7b54"),"\uff08",(0,a.kt)("a",{parentName:"li",href:"https://blog.csdn.net/duanluan"},"\u5173\u6ce8\u540e\u63d0\u95ee\u9898\u65f6 @ \u9080\u8bf7\u56de\u7b54"),"\uff09")))}s.isMDXComponent=!0}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[685],{2206:e=>{e.exports=JSON.parse('{"title":"pinyin \u62fc\u97f3","description":"Pinyin","slug":"/category/pinyin-\u62fc\u97f3","permalink":"/ZUtil/docs/category/pinyin-\u62fc\u97f3","navigation":{"previous":{"title":"DateFeature \u65f6\u95f4\u7279\u6027","permalink":"/ZUtil/docs/reference-doc/date/dateFeature"},"next":{"title":"PinyinFeature \u62fc\u97f3\u7279\u6027","permalink":"/ZUtil/docs/reference-doc/pinyin/pinyinFeature"}}}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[953],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>u});var n=a(7294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){o(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function r(e,t){if(null==e)return{};var a,n,o=function(e,t){if(null==e)return{};var a,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=n.createContext({}),m=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=m(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=r(e,["components","mdxType","originalType","parentName"]),d=m(a),h=o,u=d["".concat(s,".").concat(h)]||d[h]||c[h]||i;return a?n.createElement(u,l(l({ref:t},p),{},{components:a})):n.createElement(u,l({ref:t},p))}));function u(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[d]="string"==typeof e?e:o,l[1]=r;for(var m=2;m<i;m++)l[m]=a[m];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},4244:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>m});var n=a(7462),o=(a(7294),a(3905));const i={slug:"javaTimeZone",title:"java.time \u65f6\u533a\u8be6\u89e3",authors:["duanluan"],tags:["time","zone","\u65f6\u533a","\u65f6\u95f4"]},l=void 0,r={permalink:"/ZUtil/blog/javaTimeZone",editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-29-java.time-zone/001-java.time_\u65f6\u533a\u8be6\u89e3.md",source:"@site/blog/2022-07-29-java.time-zone/001-java.time_\u65f6\u533a\u8be6\u89e3.md",title:"java.time \u65f6\u533a\u8be6\u89e3",description:"LocalDateTime\u7c7b\u662f\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7atZone\u65b9\u6cd5\u6765\u8bbe\u7f6eZoneId\uff0c\u8fd4\u56deZonedDateTime\u7c7b\u5b9e\u4f8b\uff0c\u901a\u8fc7atOffset\u65b9\u6cd5\u6765\u8bbe\u7f6eZoneOffset\uff0c\u8fd4\u56deOffsetDateTime\u7c7b\u5b9e\u4f8b\u3002",date:"2022-07-29T00:00:00.000Z",formattedDate:"2022\u5e747\u670829\u65e5",tags:[{label:"time",permalink:"/ZUtil/blog/tags/time"},{label:"zone",permalink:"/ZUtil/blog/tags/zone"},{label:"\u65f6\u533a",permalink:"/ZUtil/blog/tags/\u65f6\u533a"},{label:"\u65f6\u95f4",permalink:"/ZUtil/blog/tags/\u65f6\u95f4"}],readingTime:15.125,hasTruncateMarker:!1,authors:[{name:"ZhongJianhao",title:"Maintainer of ZUtil",url:"https://github.com/duanluan",imageURL:"https://github.com/duanluan.png",key:"duanluan"}],frontMatter:{slug:"javaTimeZone",title:"java.time \u65f6\u533a\u8be6\u89e3",authors:["duanluan"],tags:["time","zone","\u65f6\u533a","\u65f6\u95f4"]},nextItem:{title:"\u6b22\u8fce",permalink:"/ZUtil/blog/welcome"}},s={authorsImageUrls:[void 0]},m=[{value:"ZonedDateTime \u7c7b\u6ce8\u91ca\u8be6\u89e3",id:"zoneddatetime-\u7c7b\u6ce8\u91ca\u8be6\u89e3",level:2},{value:"withZoneSameLocal \u548c withZoneSameInstant \u7684\u4f7f\u7528\u4e0e\u533a\u522b",id:"withzonesamelocal-\u548c-withzonesameinstant-\u7684\u4f7f\u7528\u4e0e\u533a\u522b",level:2},{value:"withZoneSameLocal \u7b80\u4ecb",id:"withzonesamelocal-\u7b80\u4ecb",level:3},{value:"withZoneSameInstant \u7b80\u4ecb",id:"withzonesameinstant-\u7b80\u4ecb",level:3},{value:"\u2026\u2026",id:"",level:2},{value:"\u7591\u95ee",id:"\u7591\u95ee",level:2},{value:"\u53c2\u8003",id:"\u53c2\u8003",level:2}],p={toc:m};function d(e){let{components:t,...i}=e;return(0,o.kt)("wrapper",(0,n.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u7c7b\u662f\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"atZone"),"\u65b9\u6cd5\u6765\u8bbe\u7f6e",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\uff0c\u8fd4\u56de",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u7c7b\u5b9e\u4f8b\uff0c\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"atOffset"),"\u65b9\u6cd5\u6765\u8bbe\u7f6e",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\uff0c\u8fd4\u56de",(0,o.kt)("inlineCode",{parentName:"p"},"OffsetDateTime"),"\u7c7b\u5b9e\u4f8b\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:a(784).Z,width:"506",height:"232"})),(0,o.kt)("h2",{id:"zoneddatetime-\u7c7b\u6ce8\u91ca\u8be6\u89e3"},"ZonedDateTime \u7c7b\u6ce8\u91ca\u8be6\u89e3"),(0,o.kt)("p",null,"\u6211\u4eec\u6765\u9010\u6bb5\u89e3\u8bfb\u4e00\u4e0b ZonedDateTime \u7c7b\u7684\u6ce8\u91ca\u3002"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"A date-time with a time-zone in the ISO-8601 calendar system, such as ",(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03T10:15:30+01:00 Europe/Paris"),"."),(0,o.kt)("p",{parentName:"blockquote"},"ISO-8601 \u65e5\u5386\u7cfb\u7edf\u4e2d\u5e26\u65f6\u533a\u7684\u65e5\u671f\u65f6\u95f4\uff0c\u4f8b\u5982",(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03T10:15:30+01:00 Europe/Paris"),"\u3002")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://zh.wikipedia.org/wiki/ISO_8601"},"ISO-8601")," \u6211\u4eec\u7b80\u5355\u7406\u89e3\u4e3a\u662f\u89c4\u5b9a\u65e5\u671f\u548c\u65f6\u95f4\u5982\u4f55\u8868\u793a\u7684\u6807\u51c6\u5373\u53ef\uff0c\u6b64\u5904\u4e0d\u6df1\u5165\u7814\u7a76\u3002"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03T10:15:30+01:00 Europe/Paris"),"\u4e2d\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03"),"\u4e3a\u5e74\u6708\u65e5\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"T"),"\u662f\u65e5\u671f\u548c\u65f6\u95f4\u7ec4\u5408\u8868\u793a\u65f6\u7684\u56fa\u5b9a\u5199\u6cd5\uff0c\u7528\u4e8e\u5206\u9694\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"10:15:30"),"\u662f\u5c0f\u65f6\u5206\u949f\u79d2\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"+01:00"),"\u662f\u6b64\u65e5\u671f\u65f6\u95f4\u4e0e UTC \u7684\u65f6\u5dee\u4e3a +1 \u5c0f\u65f6\uff0c\u5373",(0,o.kt)("strong",{parentName:"p"},"\u65f6\u533a\u504f\u79fb\uff08ZoneOffset\uff09"),"\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"Europe/Paris"),"\u662f\u6307\u6b64\u65e5\u671f\u65f6\u95f4\u7684\u6240\u5728\u533a\u57df\u4e3a\u6b27\u6d32/\u5df4\u9ece\uff0c\u5373",(0,o.kt)("strong",{parentName:"p"},"\u65f6\u533a ID\uff08ZoneId\uff09"),"\uff0ctime-zone ID \u8bf7\u67e5\u770b\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"},"List of tz database time zones"),"\u3002"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},'ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value "2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone" can be stored in a ',(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"."),(0,o.kt)("p",{parentName:"blockquote"},"ZonedDateTime \u662f\u5e26\u65f6\u533a\u7684\u65e5\u671f\u65f6\u95f4\u7684\u5e38\u91cf\u8868\u793a\u3002\u6b64\u7c7b\u5b58\u50a8\u6240\u6709\u7684\u65e5\u671f\u65f6\u95f4\uff08\u7cbe\u786e\u5230\u7eb3\u79d2\uff09\u548c\u65f6\u533a\uff0c\u5176\u4e2d\u65f6\u533a\u504f\u79fb\u7528\u4e8e\u5904\u7406\u4e0d\u660e\u786e\u7684\u672c\u5730\u65e5\u671f\u65f6\u95f4\u3002 \u4f8b\u5982\uff0c\u503c\u201c2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone\u201d \u53ef\u4ee5\u88ab\u5b58\u50a8\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u4e2d\u3002")),(0,o.kt)("p",null,"\u8bf4\u5b83\u662f\u5e38\u91cf\u662f\u56e0\u4e3a\u6b64\u7c7b\u662f\u88ab",(0,o.kt)("inlineCode",{parentName:"p"},"final"),"\u4fee\u9970\u7684\uff0c\u8c03\u7528\u5b83\u7684\u65b9\u6cd5\u65f6\uff0c",(0,o.kt)("strong",{parentName:"p"},"\u8fd4\u56de"),"\u7684\u90fd\u662f",(0,o.kt)("strong",{parentName:"p"},"\u65b0\u5b9e\u4f8b"),"\u3002"),(0,o.kt)("p",null,"\u201c\u65f6\u533a\u504f\u79fb\u7528\u4e8e\u5904\u7406\u4e0d\u660e\u786e\u7684\u672c\u5730\u65e5\u671f\u65f6\u95f4\u201d\uff0c\u4e4b\u6240\u4ee5\u4e0d\u660e\u786e\uff0c\u662f\u56e0\u4e3a",(0,o.kt)("a",{parentName:"p",href:"https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6"},"\u590f\u4ee4\u65f6"),"\u7684\u5b58\u5728\uff0c\u540c\u4e00\u5730\u533a\uff0c\u4e0d\u540c\u6708\u4efd\uff0c\u751a\u81f3\u4e0d\u540c\u5e74\u4efd\u7684 ZoneOffset \u53ef\u80fd\u4e0d\u4e00\u6837\u3002\u8be6\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93"},"\u65f6\u533a\u4fe1\u606f\u6570\u636e\u5e93"),"\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);\n// \u8bbe\u7f6e\u65f6\u533a ID \u4e3a \u7f8e\u56fd/\u7ebd\u7ea6\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("America/New_York"));\n// \u8f93\u51fa\u4e3a -05:00\nSystem.out.println(zonedDateTime.getOffset());\n\n// \u8bbe\u7f6e\u6708\u4efd\u4e3a 4 \u6708\uff0c\u5373\u590f\u4ee4\u65f6\nzonedDateTime = zonedDateTime.withMonth(4);\n// \u8f93\u51fa\u4e3a -04:00\nSystem.out.println(zonedDateTime.getOffset());\n\n')),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"This class handles conversion from the local time-line of ",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime")," to the instant time-line of ",(0,o.kt)("inlineCode",{parentName:"p"},"Instant"),". The difference between the two time-lines is the offset from UTC/Greenwich, represented by a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"."),(0,o.kt)("p",{parentName:"blockquote"},"\u6b64\u7c7b\u5904\u7406",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u7684\u672c\u5730\u65f6\u95f4\u7ebf\u5230",(0,o.kt)("inlineCode",{parentName:"p"},"Instant"),"\u7684\u77ac\u65f6\u65f6\u95f4\u7ebf\u3002\u4e24\u6761\u65f6\u95f4\u7ebf\u7684\u5dee\u5f02\u662f\u4e0e UTC/Greenwich \u7684\u504f\u79fb\u91cf\uff0c\u7531",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\u8868\u793a\u3002")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Instant\uff08\u77ac\u65f6\uff09"),"\u7b80\u5355\u6765\u8bf4\u5c31\u662f java.time \u4e2d\u7684\u65f6\u95f4\u6233\uff08\u7cbe\u5ea6\u4e3a\u7eb3\u79d2\uff09\uff0c\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u3002"),(0,o.kt)("p",null,"\u6b64\u5904\u8bf4\u201c\u4e24\u6761\u65f6\u95f4\u7ebf\u7684\u5dee\u5f02\u662f\u4e0e UTC/Greenwich \u7684\u504f\u79fb\u91cf\u201d\u662f\u6307 Instant \u52a0\u4e0a ZoneOffset \u5c31\u53ef\u4ee5\u83b7\u53d6 LocalDateTime\u3002\u4f46\u5982\u679c\u662f\u8981\u5c06 Instant \u8f6c\u6362\u4e3a ZonedDateTime \u7684\u8bdd\uff0c\u9700\u8981\u8bbe\u7f6e ZoneId\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},"Instant instant = Instant.now();\nLocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();\nZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());\n")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Converting between the two time-lines involves calculating the offset using the ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html"},"rules")," accessed from the ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),". Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:"),(0,o.kt)("ul",{parentName:"blockquote"},(0,o.kt)("li",{parentName:"ul"},"Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time."),(0,o.kt)("li",{parentName:"ul"},'Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from "winter" to "summer". In a gap there are local date-time values with no valid offset.'),(0,o.kt)("li",{parentName:"ul"},'Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from "summer" to "winter". In an overlap there are local date-time values with two valid offsets.')),(0,o.kt)("p",{parentName:"blockquote"},"\u4e24\u6761\u65f6\u95f4\u7ebf\u4e4b\u95f4\u7684\u8f6c\u6362\u6d89\u53ca\u5230\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\u8bbf\u95ee",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html"},"\u89c4\u5219"),"\uff08ZoneRules\uff09\u8ba1\u7b97\u504f\u79fb\u91cf\u3002\u83b7\u53d6\u4e00\u4e2a instant \u7684\u504f\u79fb\u91cf\u5f88\u7b80\u5355\uff0c\u56e0\u4e3a\u6bcf\u4e2a instant \u6b63\u597d\u6709\u4e00\u4e2a\u6709\u6548\u504f\u79fb\u91cf\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u83b7\u53d6\u4e00\u4e2a local date-time \u7684\u6709\u6548\u504f\u79fb\u91cf\n\u5e76\u4e0d\u7b80\u5355\u3002\u6709\u4e09\u79cd\u60c5\u51b5\uff1a"),(0,o.kt)("ul",{parentName:"blockquote"},(0,o.kt)("li",{parentName:"ul"},"\u6b63\u5e38\uff1a\u6709\u4e00\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u5728\u4e00\u5e74\u4e2d\u7684\u7edd\u5927\u591a\u6570\u65f6\u95f4\u91cc\uff0clocal date-time \u6709\u4e00\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u95f4\u9699\uff1a\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u8fd9\u662f\u7531\u4e8e\u6625\u5b63\u590f\u4ee4\u65f6\u4ece\u201c\u51ac\u5b63\u201d\u5230\u201c\u590f\u5b63\u201d\uff0c\u65f6\u949f\u88ab\u8c03\u5feb\u4e86\uff0c\u8df3\u8fc7\u4e86\u4e00\u6bb5\u65f6\u95f4\u3002\u5728\u8df3\u8fc7\u7684\u95f4\u9699\u4e2d\uff0c\u6709 local date-time\uff0c\u4f46\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u91cd\u53e0\uff1a\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u8fd9\u662f\u7531\u4e8e\u79cb\u5b63\u590f\u4ee4\u65f6\u4ece\u201c\u590f\u5b63\u201d\u5230\u201c\u51ac\u5b63\u201d\uff0c\u65f6\u949f\u5f80\u56de\u8c03\u4e86\u4e00\u6bb5\u65f6\u95f4\u3002\u5728\u91cd\u53e0\u7684\u60c5\u51b5\u4e0b\uff0c\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u7684 local date-time\u3002")),(0,o.kt)("p",{parentName:"blockquote"},"Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated."),(0,o.kt)("p",{parentName:"blockquote"},'For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically "summer" time.'),(0,o.kt)("p",{parentName:"blockquote"},'For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically "summer" time.. Two additional methods, ',(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()"},"withEarlierOffsetAtOverlap()")," and ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()"},"withLaterOffsetAtOverlap()"),", help manage the case of an overlap."),(0,o.kt)("p",{parentName:"blockquote"},"\u4efb\u4f55\u901a\u8fc7\u83b7\u53d6\u504f\u79fb\u91cf\u663e\u5f0f\u6216\u9690\u5f0f\u5730\u5c06 local date-time \u8f6c\u6362\u4e3a instant \u5730\u65b9\u90fd\u6709\u53ef\u80fd\u53d8\u5f97\u590d\u6742\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u5bf9\u4e8e\u95f4\u9699\uff0c\u4e00\u822c\u7b56\u7565\u662f\uff0c\u5982\u679c local date-time \u843d\u5728\u95f4\u9699\u4e2d\u95f4\uff0c\u90a3\u4e48\u4ea7\u751f\u7684 zoned date-time \u662f local date-time \u5411\u524d\u79fb\u52a8\u95f4\u6b47\u7684\u957f\u5ea6\u540e\u7684\uff0c\u5bfc\u81f4\u65e5\u671f\u5728\u8f83\u665a\u7684\u504f\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u201c\u590f\u5b63\u201d\u65f6\u95f4\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u5bf9\u4e8e\u91cd\u53e0\uff0c\u4e00\u822c\u7b56\u7565\u662f\uff0c\u5982\u679c local date-time \u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u90a3\u4e48\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u5c06\u88ab\u4fdd\u7559\u3002\u5982\u679c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\uff0c\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\uff0c\u90a3\u4e48\u5c31\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u201c\u590f\u5b63\u201d\u65f6\u95f4\u3002\u4e24\u4e2a\u989d\u5916\u7684\u65b9\u6cd5\uff0c",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()"},"withEarlierOffsetAtOverlap()")," and ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()"},"withLaterOffsetAtOverlap()"),"\uff0c\u53ef\u4ee5\u5e2e\u52a9\u7ba1\u7406\u91cd\u5408\u7684\u60c5\u51b5\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"In terms of design, this class should be viewed primarily as the combination of a ",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime")," and a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),". The ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset")," is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap."),(0,o.kt)("p",{parentName:"blockquote"},"\u5c31\u8bbe\u8ba1\u800c\u8a00\uff0c\u8fd9\u4e2a\u7c7b\u5e94\u8be5\u4e3b\u8981\u88ab\u770b\u4f5c\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\u7684\u7ec4\u5408\u3002",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\u662f\u4e00\u4e2a\u91cd\u8981\u4f46\u6b21\u8981\u7684\u4fe1\u606f\uff0c\u7528\u6765\u786e\u4fdd\u8fd9\u4e2a\u7c7b\u4ee3\u8868\u4e00\u4e2a\u77ac\u95f4\uff0c\u7279\u522b\u662f\u5728\u590f\u4ee4\u65f6\u91cd\u53e0\u7684\u65f6\u5019\u3002")),(0,o.kt)("p",null,"\u6b64\u5904\u4e3e\u4f8b\uff0c\u7f8e\u56fd\u590f\u4ee4\u65f6\u4e00\u822c\u5728 ",(0,o.kt)("strong",{parentName:"p"},"3 \u6708\u7b2c\u4e8c\u4e2a\u5468\u65e5 2AM")," \u5f00\u59cb\uff0c\u5c06\u65f6\u949f\u62e8\u5feb 1 \u5c0f\u65f6\uff0c\u8c03\u5230 3 \u70b9\uff0c\u90a3\u8fd9\u4e00\u5c0f\u65f6\u5c31\u662f\u201c\u51ac\u5b63\u201d\u5230\u201c\u590f\u5b63\u201d\u7684",(0,o.kt)("strong",{parentName:"p"},"\u95f4\u9699\uff08Gap\uff09"),"\uff1b\u5728 ",(0,o.kt)("strong",{parentName:"p"},"11 \u6708\u7b2c\u4e00\u4e2a\u5468\u65e5 2AM"),"\uff0c\u53c8\u4f1a\u5c06\u65f6\u949f\u62e8\u6162 1 \u5c0f\u65f6\uff0c\u8c03\u56de\u5230 1 \u70b9\uff0c\u90a3\u8fd9\u4e00\u5c0f\u65f6\u5c31\u662f\u201c\u590f\u5b63\u201d\u5230\u201c\u51ac\u5b63\u201d\u7684",(0,o.kt)("strong",{parentName:"p"},"\u91cd\u53e0\uff08Overlap\uff09"),"\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'ZoneId zoneId = ZoneId.of("America/New_York");\nZoneRules zoneRules = zoneId.getRules();\n// \u7f8e\u56fd/\u7ebd\u7ea6 2022 \u5e74\u7684\u590f\u4ee4\u65f6\u95f4\u6b47\u65f6\u95f4\u4e3a 03-13 02:00 ~ 03:00\uff08\u4e0d\u5305\u542b 03:00\uff09\nLocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);\nZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);\nSystem.out.println(zoneRulesTransition);\nSystem.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u95f4\u6b47\u4e2d\u95f4\uff0c\u90a3\u5bf9\u5e94\u7684 zoned date-time \u4f1a\u52a0\u4e0a\u95f4\u6b47\u957f\u5ea6\uff08\u6b64\u5904\u4e3a 1 \u5c0f\u65f6\uff09\uff0c\u540c\u65f6\u65f6\u533a\u504f\u79fb\u91cf\u4e3a\u590f\u4ee4\u65f6\u504f\u79fb\u91cf\u3002\nSystem.out.println(localDateTime.atZone(zoneId));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\nTransition[Gap at 2022-03-13T02:00-05:00 to -04:00]\nnull\n2022-03-13T03:30-04:00[America/New_York]\n')),(0,o.kt)("p",null,"\u8bf4\u201c\u95f4\u6b47\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u201d\uff0c\u662f\u56e0\u4e3a\u843d\u5728\u95f4\u6b47\u518d\u8f6c\u6362\u4e3a zoned date-time \u540e\uff0c\u4f1a\u81ea\u52a8\u52a0\u4e0a\u95f4\u6b47\u957f\u5ea6\uff0c\u6240\u4ee5\u90a3\u6bb5\u65f6\u95f4\u53ea\u6709 local date-time\uff0c\u6ca1\u6709\u504f\u79fb\u91cf\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'ZoneId zoneId = ZoneId.of("America/New_York");\nZoneRules zoneRules = zoneId.getRules();\n// \u7f8e\u56fd/\u7ebd\u7ea6 2022 \u5e74\u7684\u590f\u4ee4\u65f6\u91cd\u53e0\u65f6\u95f4\u4e3a 11-06 01:00 ~ 02:00\uff08\u4e0d\u5305\u542b 02:00\uff09\nLocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);\nZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);\nSystem.out.println(zoneRulesTransition);\nSystem.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff0c\u5373\u590f\u4ee4\u65f6\u504f\u79fb\u91cf -04:00\nSystem.out.println(localDateTime.atZone(zoneId));\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u4ee5\u524d\u6709\u504f\u79fb\u91cf\u4e14\u66f4\u665a\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u665a\u7684\u504f\u79fb\u91cf\uff0c\u5373\u975e\u590f\u4ee4\u65f6\u504f\u79fb\u91cf -05:00\nSystem.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\nTransition[Overlap at 2022-11-06T02:00-04:00 to -05:00]\nnull\n2022-11-06T01:30-04:00[America/New_York]\n2022-11-06T02:30-05:00[America/New_York]\n')),(0,o.kt)("p",null,"\u8bf4\u201c\u91cd\u53e0\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u201d\uff0c\u662f\u56e0\u4e3a\u843d\u5728\u91cd\u53e0\u65f6\uff0c\u5982\u679c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff1b\u5982\u679c\u4ee5\u524d\u6709\u504f\u79fb\u91cf\u4e14\u66f4\u665a\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u665a\u7684\u504f\u79fb\u91cf\u3002"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"This is a ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html"},"value-based")," class; use of identity-sensitive operations (including reference equality (",(0,o.kt)("inlineCode",{parentName:"p"},"=="),"), identity hash code, or synchronization) on instances of ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," may have unpredictable results and should be avoided. The ",(0,o.kt)("inlineCode",{parentName:"p"},"equals")," method should be used for comparisons."),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u662f\u4e00\u4e2a ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html"},"value-based")," \u7c7b\uff1b\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u7684\u5b9e\u4f8b\u4e0a\u4f7f\u7528 identity-sensitive \u7684\u64cd\u4f5c\uff08\u5305\u62ec\u5f15\u7528\u76f8\u7b49",(0,o.kt)("inlineCode",{parentName:"p"},"=="),"\u3001identity hash code \u6216\u540c\u6b65 synchronization\uff09\u53ef\u80fd\u4f1a\u4ea7\u751f\u4e0d\u53ef\u9884\u6d4b\u7684\u7ed3\u679c\uff0c\u6240\u4ee5\u8981\u907f\u514d\u3002\u5e94\u8be5\u4f7f\u7528 equals \u65b9\u6cd5\u6765\u8fdb\u884c\u6bd4\u8f83\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"A ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," holds state equivalent to three separate objects, a ",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),", a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId")," and the resolved ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),". The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid."),(0,o.kt)("p",{parentName:"blockquote"},"\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u76f8\u5f53\u4e8e\u6301\u6709\u4e09\u4e2a\u72ec\u7acb\u5bf9\u8c61\u7684\u72b6\u6001\uff0c\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\uff0c\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\u548c\u5df2\u89e3\u51b3\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\u3002\u5fc5\u8981\u65f6\uff0c\u504f\u79fb\u91cf\u548c local date-time \u88ab\u7528\u6765\u5b9a\u4e49\u4e00\u4e2a\u77ac\u95f4\u3002zone ID \u88ab\u7528\u6765\u83b7\u53d6\u504f\u79fb\u91cf\u53ca\u4f55\u65f6\u53d8\u5316\u7684\u89c4\u5219\u3002\u504f\u79fb\u91cf\u4e0d\u80fd\u81ea\u7531\u8bbe\u7f6e\uff0c\u56e0\u4e3a\u65f6\u533a\u63a7\u5236\u7740\u54ea\u4e9b\u504f\u79fb\u91cf\u65f6\u6709\u6548\u7684\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"This class is immutable and thread-safe."),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u7c7b\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u5e76\u4e14\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002")),(0,o.kt)("h2",{id:"withzonesamelocal-\u548c-withzonesameinstant-\u7684\u4f7f\u7528\u4e0e\u533a\u522b"},"withZoneSameLocal \u548c withZoneSameInstant \u7684\u4f7f\u7528\u4e0e\u533a\u522b"),(0,o.kt)("h3",{id:"withzonesamelocal-\u7b80\u4ecb"},"withZoneSameLocal \u7b80\u4ecb"),(0,o.kt)("p",null,"\u5148\u770b ",(0,o.kt)("inlineCode",{parentName:"p"},"withZoneSameLocal")," \u65b9\u6cd5\u7684\u6ce8\u91ca\uff1a"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible."),(0,o.kt)("p",{parentName:"blockquote"},"This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)"},"ofLocal(LocalDateTime, ZoneId, ZoneOffset)"),"."),(0,o.kt)("p",{parentName:"blockquote"},"To change the zone and adjust the local date-time, use ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)"},"withZoneSameInstant(ZoneId)"),"."),(0,o.kt)("p",{parentName:"blockquote"},"This instance is immutable and unaffected by this method call."),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@param")," ",(0,o.kt)("inlineCode",{parentName:"p"},"zone")," \u2013 the time-zone to change to, not null"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@return")," a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," based on this date-time with the requested zone, not null"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd4\u56de\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u65f6\u533a\u7684 date-time \u7684\u526f\u672c\uff0c\u5982\u679c\u53ef\u80fd\u7684\u8bdd\uff0c\u4fdd\u7559 local date-time\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u65b9\u6cd5\u6539\u53d8\u4e86\u65f6\u533a\u5e76\u4fdd\u7559\u4e86 local date-time\u3002\u5728\u65b0\u7684\u65f6\u533a\u65e0\u6548\u65f6\uff0clocal date-time \u624d\u4f1a\u88ab\u6539\u53d8\uff0c\u4e0e\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)"},"ofLocal(LocalDateTime, ZoneId, ZoneOffset)")," \u65b9\u6cd5\u76f8\u540c\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8981\u6539\u53d8\u533a\u57df\u5e76\u8c03\u6574 local date-time\uff0c\u8bf7\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)"},"withZoneSameInstant(ZoneId)"),"\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u88ab\u8c03\u7528\u5b9e\u4f8b\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u4e0d\u53d7\u6b64\u65b9\u6cd5\u8c03\u7528\u7684\u5f71\u54cd\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u5f62\u53c2"),"\uff1azone - \u8981\u6539\u53d8\u7684\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u8fd4\u56de\u503c"),"\uff1aa ZonedDateTime - \u57fa\u4e8e\u8be5 date-time \u7684\u8bf7\u6c42\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002")),(0,o.kt)("p",null,"\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u4fee\u6539\u65f6\u533a\u4f46\u662f\u4fdd\u6301 local date-time \u4e0d\u53d8\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'LocalDateTime localDateTime = LocalDateTime.now();\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));\nSystem.out.println(zonedDateTime);\nSystem.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of("Europe/Moscow")));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\n2022-08-08T18:45:22.711+08:00[Asia/Shanghai]\n2022-08-08T18:45:22.711+03:00[Europe/Moscow]\n')),(0,o.kt)("h3",{id:"withzonesameinstant-\u7b80\u4ecb"},"withZoneSameInstant \u7b80\u4ecb"),(0,o.kt)("p",null,"\u518d\u770b ",(0,o.kt)("inlineCode",{parentName:"p"},"withZoneSameInstant")," \u65b9\u6cd5\u6ce8\u91ca\uff1a"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Returns a copy of this date-time with a different time-zone, retaining the instant."),(0,o.kt)("p",{parentName:"blockquote"},"This method changes the time-zone and retains the instant. This normally results in a change to the local date-time."),(0,o.kt)("p",{parentName:"blockquote"},"This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result."),(0,o.kt)("p",{parentName:"blockquote"},"To change the offset while keeping the local time, use ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)"},"withZoneSameLocal(ZoneId)"),"."),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@param")," ",(0,o.kt)("inlineCode",{parentName:"p"},"zone")," \u2013 the time-zone to change to, not null"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@return")," a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," based on this date-time with the requested zone, not null"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@throws")," ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html"},"DateTimeException")," \u2013 if the result exceeds the supported date range"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd4\u56de\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u65f6\u533a\u7684 date-time \u7684\u526f\u672c\uff0c\u4fdd\u7559 instant\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u65b9\u6cd5\u6539\u53d8\u4e86\u65f6\u533a\u5e76\u4fdd\u7559\u4e86 instant\u3002\u8fd9\u901a\u5e38\u4f1a\u5bfc\u81f4 local date-time \u7684\u6539\u53d8\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u65b9\u6cd5\u662f\u57fa\u4e8e\u4fdd\u7559\u76f8\u540c\u7684 instant\uff0c\u56e0\u6b64\u672c\u5730\u65f6\u95f4\u7ebf\u7684\u95f4\u6b47\u548c\u91cd\u53e0\u5bf9\u7ed3\u679c\u6ca1\u6709\u5f71\u54cd\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8981\u4fdd\u6301 local date-time \u7684\u540c\u65f6\u6539\u53d8\u504f\u79fb\u91cf\uff0c\u8bf7\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)"},"withZoneSameLocal(ZoneId)"),"\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u5f62\u53c2"),"\uff1a",(0,o.kt)("inlineCode",{parentName:"p"},"zone")," - \u8981\u6539\u53d8\u7684\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u8fd4\u56de\u503c"),"\uff1aa ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," - \u57fa\u4e8e\u8be5 date-time \u7684\u8bf7\u6c42\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u629b\u51fa"),"\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html"},"DateTimeException")," \u2013 \u5982\u679c\u7ed3\u679c\u8d85\u51fa\u4e86\u652f\u6301\u7684\u65e5\u671f\u8303\u56f4\u3002")),(0,o.kt)("p",null,"\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u4fee\u6539\u65f6\u533a\u4f46\u662f\u4fdd\u6301 instant \u4e0d\u53d8\u3002\u56e0\u4e3a\u65f6\u533a\u53d8\u4e86\uff0c\u504f\u79fb\u91cf\u80af\u5b9a\u53d8\u4e86\uff0c\u6240\u4ee5 local date-time \u4e5f\u4f1a\u6539\u53d8\u4ee5\u4fdd\u6301 instant \u4e0d\u53d8\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'LocalDateTime localDateTime = LocalDateTime.now();\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));\nSystem.out.println(zonedDateTime);\nSystem.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Moscow")));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\n2022-08-09T20:06:35.753+08:00[Asia/Shanghai]\n2022-08-09T15:06:35.753+03:00[Europe/Moscow]\n')),(0,o.kt)("h2",{id:""},"\u2026\u2026"),(0,o.kt)("h2",{id:"\u7591\u95ee"},"\u7591\u95ee"),(0,o.kt)("p",null,"\u6211\u4e86\u89e3\u7684\u5e76\u4e0d\u5168\u9762\uff0c\u6216\u8005\u662f\u56e0\u4e3a\u82f1\u8bed\u80fd\u529b\u6709\u9650\uff0c\u539f\u672c\u8981\u548c\u4e0a\u4e0b\u6587\u5173\u8054\u7406\u89e3\u7684\u5730\u65b9\u6ca1\u7ffb\u8bd1\u597d\uff0c\u5bfc\u81f4\u6211\u6709\u4ee5\u4e0b\u7591\u95ee\u3002\u5982\u679c\u4f60\u77e5\u9053\uff0c\u6b22\u8fce\u8054\u7cfb\u6211\uff01"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u6587\u4e2d\u201cor the previous offset is invalid\u201d\u3001\u201cThe local date-time is only changed if it is invalid for the new zone\u201d\u8fd9\u4e24\u6bb5\u8bdd\u7684\u65e0\u6548\u504f\u79fb\u91cf\u3001\u65f6\u533a\u5177\u4f53\u6307\u7684\u662f\u4ec0\u4e48\uff1f")),(0,o.kt)("h2",{id:"\u53c2\u8003"},"\u53c2\u8003"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93"},"\u65f6\u533a\u4fe1\u606f\u6570\u636e\u5e93 - \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"},"List of tz database time zones - Wikipedia")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6"},"\u590f\u4ee4\u65f6 - \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66"))))}d.isMDXComponent=!0},784:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png"}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[352],{2919:t=>{t.exports=JSON.parse('{"permalink":"/ZUtil/blog/tags/\u65f6\u95f4","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
"use strict";(self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[]).push([[39],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>u});var n=a(7294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){o(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function r(e,t){if(null==e)return{};var a,n,o=function(e,t){if(null==e)return{};var a,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=n.createContext({}),m=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=m(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=r(e,["components","mdxType","originalType","parentName"]),d=m(a),h=o,u=d["".concat(s,".").concat(h)]||d[h]||c[h]||i;return a?n.createElement(u,l(l({ref:t},p),{},{components:a})):n.createElement(u,l({ref:t},p))}));function u(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[d]="string"==typeof e?e:o,l[1]=r;for(var m=2;m<i;m++)l[m]=a[m];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},8718:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>m});var n=a(7462),o=(a(7294),a(3905));const i={slug:"javaTimeZone",title:"java.time \u65f6\u533a\u8be6\u89e3",authors:["duanluan"],tags:["time","zone","\u65f6\u533a","\u65f6\u95f4"]},l=void 0,r={permalink:"/ZUtil/blog/javaTimeZone",editUrl:"https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-29-java.time-zone/001-java.time_\u65f6\u533a\u8be6\u89e3.md",source:"@site/blog/2022-07-29-java.time-zone/001-java.time_\u65f6\u533a\u8be6\u89e3.md",title:"java.time \u65f6\u533a\u8be6\u89e3",description:"LocalDateTime\u7c7b\u662f\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7atZone\u65b9\u6cd5\u6765\u8bbe\u7f6eZoneId\uff0c\u8fd4\u56deZonedDateTime\u7c7b\u5b9e\u4f8b\uff0c\u901a\u8fc7atOffset\u65b9\u6cd5\u6765\u8bbe\u7f6eZoneOffset\uff0c\u8fd4\u56deOffsetDateTime\u7c7b\u5b9e\u4f8b\u3002",date:"2022-07-29T00:00:00.000Z",formattedDate:"2022\u5e747\u670829\u65e5",tags:[{label:"time",permalink:"/ZUtil/blog/tags/time"},{label:"zone",permalink:"/ZUtil/blog/tags/zone"},{label:"\u65f6\u533a",permalink:"/ZUtil/blog/tags/\u65f6\u533a"},{label:"\u65f6\u95f4",permalink:"/ZUtil/blog/tags/\u65f6\u95f4"}],readingTime:15.125,hasTruncateMarker:!1,authors:[{name:"ZhongJianhao",title:"Maintainer of ZUtil",url:"https://github.com/duanluan",imageURL:"https://github.com/duanluan.png",key:"duanluan"}],frontMatter:{slug:"javaTimeZone",title:"java.time \u65f6\u533a\u8be6\u89e3",authors:["duanluan"],tags:["time","zone","\u65f6\u533a","\u65f6\u95f4"]},nextItem:{title:"\u6b22\u8fce",permalink:"/ZUtil/blog/welcome"}},s={authorsImageUrls:[void 0]},m=[{value:"ZonedDateTime \u7c7b\u6ce8\u91ca\u8be6\u89e3",id:"zoneddatetime-\u7c7b\u6ce8\u91ca\u8be6\u89e3",level:2},{value:"withZoneSameLocal \u548c withZoneSameInstant \u7684\u4f7f\u7528\u4e0e\u533a\u522b",id:"withzonesamelocal-\u548c-withzonesameinstant-\u7684\u4f7f\u7528\u4e0e\u533a\u522b",level:2},{value:"withZoneSameLocal \u7b80\u4ecb",id:"withzonesamelocal-\u7b80\u4ecb",level:3},{value:"withZoneSameInstant \u7b80\u4ecb",id:"withzonesameinstant-\u7b80\u4ecb",level:3},{value:"\u2026\u2026",id:"",level:2},{value:"\u7591\u95ee",id:"\u7591\u95ee",level:2},{value:"\u53c2\u8003",id:"\u53c2\u8003",level:2}],p={toc:m};function d(e){let{components:t,...i}=e;return(0,o.kt)("wrapper",(0,n.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u7c7b\u662f\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"atZone"),"\u65b9\u6cd5\u6765\u8bbe\u7f6e",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\uff0c\u8fd4\u56de",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u7c7b\u5b9e\u4f8b\uff0c\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"atOffset"),"\u65b9\u6cd5\u6765\u8bbe\u7f6e",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\uff0c\u8fd4\u56de",(0,o.kt)("inlineCode",{parentName:"p"},"OffsetDateTime"),"\u7c7b\u5b9e\u4f8b\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:a(784).Z,width:"506",height:"232"})),(0,o.kt)("h2",{id:"zoneddatetime-\u7c7b\u6ce8\u91ca\u8be6\u89e3"},"ZonedDateTime \u7c7b\u6ce8\u91ca\u8be6\u89e3"),(0,o.kt)("p",null,"\u6211\u4eec\u6765\u9010\u6bb5\u89e3\u8bfb\u4e00\u4e0b ZonedDateTime \u7c7b\u7684\u6ce8\u91ca\u3002"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"A date-time with a time-zone in the ISO-8601 calendar system, such as ",(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03T10:15:30+01:00 Europe/Paris"),"."),(0,o.kt)("p",{parentName:"blockquote"},"ISO-8601 \u65e5\u5386\u7cfb\u7edf\u4e2d\u5e26\u65f6\u533a\u7684\u65e5\u671f\u65f6\u95f4\uff0c\u4f8b\u5982",(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03T10:15:30+01:00 Europe/Paris"),"\u3002")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://zh.wikipedia.org/wiki/ISO_8601"},"ISO-8601")," \u6211\u4eec\u7b80\u5355\u7406\u89e3\u4e3a\u662f\u89c4\u5b9a\u65e5\u671f\u548c\u65f6\u95f4\u5982\u4f55\u8868\u793a\u7684\u6807\u51c6\u5373\u53ef\uff0c\u6b64\u5904\u4e0d\u6df1\u5165\u7814\u7a76\u3002"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03T10:15:30+01:00 Europe/Paris"),"\u4e2d\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"2007-12-03"),"\u4e3a\u5e74\u6708\u65e5\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"T"),"\u662f\u65e5\u671f\u548c\u65f6\u95f4\u7ec4\u5408\u8868\u793a\u65f6\u7684\u56fa\u5b9a\u5199\u6cd5\uff0c\u7528\u4e8e\u5206\u9694\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"10:15:30"),"\u662f\u5c0f\u65f6\u5206\u949f\u79d2\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"+01:00"),"\u662f\u6b64\u65e5\u671f\u65f6\u95f4\u4e0e UTC \u7684\u65f6\u5dee\u4e3a +1 \u5c0f\u65f6\uff0c\u5373",(0,o.kt)("strong",{parentName:"p"},"\u65f6\u533a\u504f\u79fb\uff08ZoneOffset\uff09"),"\uff1b",(0,o.kt)("inlineCode",{parentName:"p"},"Europe/Paris"),"\u662f\u6307\u6b64\u65e5\u671f\u65f6\u95f4\u7684\u6240\u5728\u533a\u57df\u4e3a\u6b27\u6d32/\u5df4\u9ece\uff0c\u5373",(0,o.kt)("strong",{parentName:"p"},"\u65f6\u533a ID\uff08ZoneId\uff09"),"\uff0ctime-zone ID \u8bf7\u67e5\u770b\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"},"List of tz database time zones"),"\u3002"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},'ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value "2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone" can be stored in a ',(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"."),(0,o.kt)("p",{parentName:"blockquote"},"ZonedDateTime \u662f\u5e26\u65f6\u533a\u7684\u65e5\u671f\u65f6\u95f4\u7684\u5e38\u91cf\u8868\u793a\u3002\u6b64\u7c7b\u5b58\u50a8\u6240\u6709\u7684\u65e5\u671f\u65f6\u95f4\uff08\u7cbe\u786e\u5230\u7eb3\u79d2\uff09\u548c\u65f6\u533a\uff0c\u5176\u4e2d\u65f6\u533a\u504f\u79fb\u7528\u4e8e\u5904\u7406\u4e0d\u660e\u786e\u7684\u672c\u5730\u65e5\u671f\u65f6\u95f4\u3002 \u4f8b\u5982\uff0c\u503c\u201c2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone\u201d \u53ef\u4ee5\u88ab\u5b58\u50a8\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u4e2d\u3002")),(0,o.kt)("p",null,"\u8bf4\u5b83\u662f\u5e38\u91cf\u662f\u56e0\u4e3a\u6b64\u7c7b\u662f\u88ab",(0,o.kt)("inlineCode",{parentName:"p"},"final"),"\u4fee\u9970\u7684\uff0c\u8c03\u7528\u5b83\u7684\u65b9\u6cd5\u65f6\uff0c",(0,o.kt)("strong",{parentName:"p"},"\u8fd4\u56de"),"\u7684\u90fd\u662f",(0,o.kt)("strong",{parentName:"p"},"\u65b0\u5b9e\u4f8b"),"\u3002"),(0,o.kt)("p",null,"\u201c\u65f6\u533a\u504f\u79fb\u7528\u4e8e\u5904\u7406\u4e0d\u660e\u786e\u7684\u672c\u5730\u65e5\u671f\u65f6\u95f4\u201d\uff0c\u4e4b\u6240\u4ee5\u4e0d\u660e\u786e\uff0c\u662f\u56e0\u4e3a",(0,o.kt)("a",{parentName:"p",href:"https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6"},"\u590f\u4ee4\u65f6"),"\u7684\u5b58\u5728\uff0c\u540c\u4e00\u5730\u533a\uff0c\u4e0d\u540c\u6708\u4efd\uff0c\u751a\u81f3\u4e0d\u540c\u5e74\u4efd\u7684 ZoneOffset \u53ef\u80fd\u4e0d\u4e00\u6837\u3002\u8be6\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93"},"\u65f6\u533a\u4fe1\u606f\u6570\u636e\u5e93"),"\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);\n// \u8bbe\u7f6e\u65f6\u533a ID \u4e3a \u7f8e\u56fd/\u7ebd\u7ea6\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("America/New_York"));\n// \u8f93\u51fa\u4e3a -05:00\nSystem.out.println(zonedDateTime.getOffset());\n\n// \u8bbe\u7f6e\u6708\u4efd\u4e3a 4 \u6708\uff0c\u5373\u590f\u4ee4\u65f6\nzonedDateTime = zonedDateTime.withMonth(4);\n// \u8f93\u51fa\u4e3a -04:00\nSystem.out.println(zonedDateTime.getOffset());\n\n')),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"This class handles conversion from the local time-line of ",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime")," to the instant time-line of ",(0,o.kt)("inlineCode",{parentName:"p"},"Instant"),". The difference between the two time-lines is the offset from UTC/Greenwich, represented by a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"."),(0,o.kt)("p",{parentName:"blockquote"},"\u6b64\u7c7b\u5904\u7406",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u7684\u672c\u5730\u65f6\u95f4\u7ebf\u5230",(0,o.kt)("inlineCode",{parentName:"p"},"Instant"),"\u7684\u77ac\u65f6\u65f6\u95f4\u7ebf\u3002\u4e24\u6761\u65f6\u95f4\u7ebf\u7684\u5dee\u5f02\u662f\u4e0e UTC/Greenwich \u7684\u504f\u79fb\u91cf\uff0c\u7531",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\u8868\u793a\u3002")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Instant\uff08\u77ac\u65f6\uff09"),"\u7b80\u5355\u6765\u8bf4\u5c31\u662f java.time \u4e2d\u7684\u65f6\u95f4\u6233\uff08\u7cbe\u5ea6\u4e3a\u7eb3\u79d2\uff09\uff0c\u4e0d\u5305\u542b\u65f6\u533a\u4fe1\u606f\u3002"),(0,o.kt)("p",null,"\u6b64\u5904\u8bf4\u201c\u4e24\u6761\u65f6\u95f4\u7ebf\u7684\u5dee\u5f02\u662f\u4e0e UTC/Greenwich \u7684\u504f\u79fb\u91cf\u201d\u662f\u6307 Instant \u52a0\u4e0a ZoneOffset \u5c31\u53ef\u4ee5\u83b7\u53d6 LocalDateTime\u3002\u4f46\u5982\u679c\u662f\u8981\u5c06 Instant \u8f6c\u6362\u4e3a ZonedDateTime \u7684\u8bdd\uff0c\u9700\u8981\u8bbe\u7f6e ZoneId\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},"Instant instant = Instant.now();\nLocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();\nZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());\n")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Converting between the two time-lines involves calculating the offset using the ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html"},"rules")," accessed from the ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),". Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:"),(0,o.kt)("ul",{parentName:"blockquote"},(0,o.kt)("li",{parentName:"ul"},"Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time."),(0,o.kt)("li",{parentName:"ul"},'Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from "winter" to "summer". In a gap there are local date-time values with no valid offset.'),(0,o.kt)("li",{parentName:"ul"},'Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from "summer" to "winter". In an overlap there are local date-time values with two valid offsets.')),(0,o.kt)("p",{parentName:"blockquote"},"\u4e24\u6761\u65f6\u95f4\u7ebf\u4e4b\u95f4\u7684\u8f6c\u6362\u6d89\u53ca\u5230\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\u8bbf\u95ee",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html"},"\u89c4\u5219"),"\uff08ZoneRules\uff09\u8ba1\u7b97\u504f\u79fb\u91cf\u3002\u83b7\u53d6\u4e00\u4e2a instant \u7684\u504f\u79fb\u91cf\u5f88\u7b80\u5355\uff0c\u56e0\u4e3a\u6bcf\u4e2a instant \u6b63\u597d\u6709\u4e00\u4e2a\u6709\u6548\u504f\u79fb\u91cf\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u83b7\u53d6\u4e00\u4e2a local date-time \u7684\u6709\u6548\u504f\u79fb\u91cf\n\u5e76\u4e0d\u7b80\u5355\u3002\u6709\u4e09\u79cd\u60c5\u51b5\uff1a"),(0,o.kt)("ul",{parentName:"blockquote"},(0,o.kt)("li",{parentName:"ul"},"\u6b63\u5e38\uff1a\u6709\u4e00\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u5728\u4e00\u5e74\u4e2d\u7684\u7edd\u5927\u591a\u6570\u65f6\u95f4\u91cc\uff0clocal date-time \u6709\u4e00\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u95f4\u9699\uff1a\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u8fd9\u662f\u7531\u4e8e\u6625\u5b63\u590f\u4ee4\u65f6\u4ece\u201c\u51ac\u5b63\u201d\u5230\u201c\u590f\u5b63\u201d\uff0c\u65f6\u949f\u88ab\u8c03\u5feb\u4e86\uff0c\u8df3\u8fc7\u4e86\u4e00\u6bb5\u65f6\u95f4\u3002\u5728\u8df3\u8fc7\u7684\u95f4\u9699\u4e2d\uff0c\u6709 local date-time\uff0c\u4f46\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u91cd\u53e0\uff1a\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u3002\u8fd9\u662f\u7531\u4e8e\u79cb\u5b63\u590f\u4ee4\u65f6\u4ece\u201c\u590f\u5b63\u201d\u5230\u201c\u51ac\u5b63\u201d\uff0c\u65f6\u949f\u5f80\u56de\u8c03\u4e86\u4e00\u6bb5\u65f6\u95f4\u3002\u5728\u91cd\u53e0\u7684\u60c5\u51b5\u4e0b\uff0c\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u7684 local date-time\u3002")),(0,o.kt)("p",{parentName:"blockquote"},"Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated."),(0,o.kt)("p",{parentName:"blockquote"},'For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically "summer" time.'),(0,o.kt)("p",{parentName:"blockquote"},'For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically "summer" time.. Two additional methods, ',(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()"},"withEarlierOffsetAtOverlap()")," and ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()"},"withLaterOffsetAtOverlap()"),", help manage the case of an overlap."),(0,o.kt)("p",{parentName:"blockquote"},"\u4efb\u4f55\u901a\u8fc7\u83b7\u53d6\u504f\u79fb\u91cf\u663e\u5f0f\u6216\u9690\u5f0f\u5730\u5c06 local date-time \u8f6c\u6362\u4e3a instant \u5730\u65b9\u90fd\u6709\u53ef\u80fd\u53d8\u5f97\u590d\u6742\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u5bf9\u4e8e\u95f4\u9699\uff0c\u4e00\u822c\u7b56\u7565\u662f\uff0c\u5982\u679c local date-time \u843d\u5728\u95f4\u9699\u4e2d\u95f4\uff0c\u90a3\u4e48\u4ea7\u751f\u7684 zoned date-time \u662f local date-time \u5411\u524d\u79fb\u52a8\u95f4\u6b47\u7684\u957f\u5ea6\u540e\u7684\uff0c\u5bfc\u81f4\u65e5\u671f\u5728\u8f83\u665a\u7684\u504f\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u201c\u590f\u5b63\u201d\u65f6\u95f4\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u5bf9\u4e8e\u91cd\u53e0\uff0c\u4e00\u822c\u7b56\u7565\u662f\uff0c\u5982\u679c local date-time \u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u90a3\u4e48\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u5c06\u88ab\u4fdd\u7559\u3002\u5982\u679c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\uff0c\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\uff0c\u90a3\u4e48\u5c31\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff0c\u901a\u5e38\u662f\u201c\u590f\u5b63\u201d\u65f6\u95f4\u3002\u4e24\u4e2a\u989d\u5916\u7684\u65b9\u6cd5\uff0c",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()"},"withEarlierOffsetAtOverlap()")," and ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()"},"withLaterOffsetAtOverlap()"),"\uff0c\u53ef\u4ee5\u5e2e\u52a9\u7ba1\u7406\u91cd\u5408\u7684\u60c5\u51b5\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"In terms of design, this class should be viewed primarily as the combination of a ",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime")," and a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),". The ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset")," is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap."),(0,o.kt)("p",{parentName:"blockquote"},"\u5c31\u8bbe\u8ba1\u800c\u8a00\uff0c\u8fd9\u4e2a\u7c7b\u5e94\u8be5\u4e3b\u8981\u88ab\u770b\u4f5c\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\u7684\u7ec4\u5408\u3002",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\u662f\u4e00\u4e2a\u91cd\u8981\u4f46\u6b21\u8981\u7684\u4fe1\u606f\uff0c\u7528\u6765\u786e\u4fdd\u8fd9\u4e2a\u7c7b\u4ee3\u8868\u4e00\u4e2a\u77ac\u95f4\uff0c\u7279\u522b\u662f\u5728\u590f\u4ee4\u65f6\u91cd\u53e0\u7684\u65f6\u5019\u3002")),(0,o.kt)("p",null,"\u6b64\u5904\u4e3e\u4f8b\uff0c\u7f8e\u56fd\u590f\u4ee4\u65f6\u4e00\u822c\u5728 ",(0,o.kt)("strong",{parentName:"p"},"3 \u6708\u7b2c\u4e8c\u4e2a\u5468\u65e5 2AM")," \u5f00\u59cb\uff0c\u5c06\u65f6\u949f\u62e8\u5feb 1 \u5c0f\u65f6\uff0c\u8c03\u5230 3 \u70b9\uff0c\u90a3\u8fd9\u4e00\u5c0f\u65f6\u5c31\u662f\u201c\u51ac\u5b63\u201d\u5230\u201c\u590f\u5b63\u201d\u7684",(0,o.kt)("strong",{parentName:"p"},"\u95f4\u9699\uff08Gap\uff09"),"\uff1b\u5728 ",(0,o.kt)("strong",{parentName:"p"},"11 \u6708\u7b2c\u4e00\u4e2a\u5468\u65e5 2AM"),"\uff0c\u53c8\u4f1a\u5c06\u65f6\u949f\u62e8\u6162 1 \u5c0f\u65f6\uff0c\u8c03\u56de\u5230 1 \u70b9\uff0c\u90a3\u8fd9\u4e00\u5c0f\u65f6\u5c31\u662f\u201c\u590f\u5b63\u201d\u5230\u201c\u51ac\u5b63\u201d\u7684",(0,o.kt)("strong",{parentName:"p"},"\u91cd\u53e0\uff08Overlap\uff09"),"\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'ZoneId zoneId = ZoneId.of("America/New_York");\nZoneRules zoneRules = zoneId.getRules();\n// \u7f8e\u56fd/\u7ebd\u7ea6 2022 \u5e74\u7684\u590f\u4ee4\u65f6\u95f4\u6b47\u65f6\u95f4\u4e3a 03-13 02:00 ~ 03:00\uff08\u4e0d\u5305\u542b 03:00\uff09\nLocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);\nZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);\nSystem.out.println(zoneRulesTransition);\nSystem.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u95f4\u6b47\u4e2d\u95f4\uff0c\u90a3\u5bf9\u5e94\u7684 zoned date-time \u4f1a\u52a0\u4e0a\u95f4\u6b47\u957f\u5ea6\uff08\u6b64\u5904\u4e3a 1 \u5c0f\u65f6\uff09\uff0c\u540c\u65f6\u65f6\u533a\u504f\u79fb\u91cf\u4e3a\u590f\u4ee4\u65f6\u504f\u79fb\u91cf\u3002\nSystem.out.println(localDateTime.atZone(zoneId));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\nTransition[Gap at 2022-03-13T02:00-05:00 to -04:00]\nnull\n2022-03-13T03:30-04:00[America/New_York]\n')),(0,o.kt)("p",null,"\u8bf4\u201c\u95f4\u6b47\u6ca1\u6709\u6709\u6548\u7684\u504f\u79fb\u91cf\u201d\uff0c\u662f\u56e0\u4e3a\u843d\u5728\u95f4\u6b47\u518d\u8f6c\u6362\u4e3a zoned date-time \u540e\uff0c\u4f1a\u81ea\u52a8\u52a0\u4e0a\u95f4\u6b47\u957f\u5ea6\uff0c\u6240\u4ee5\u90a3\u6bb5\u65f6\u95f4\u53ea\u6709 local date-time\uff0c\u6ca1\u6709\u504f\u79fb\u91cf\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'ZoneId zoneId = ZoneId.of("America/New_York");\nZoneRules zoneRules = zoneId.getRules();\n// \u7f8e\u56fd/\u7ebd\u7ea6 2022 \u5e74\u7684\u590f\u4ee4\u65f6\u91cd\u53e0\u65f6\u95f4\u4e3a 11-06 01:00 ~ 02:00\uff08\u4e0d\u5305\u542b 02:00\uff09\nLocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);\nZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);\nSystem.out.println(zoneRulesTransition);\nSystem.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff0c\u5373\u590f\u4ee4\u65f6\u504f\u79fb\u91cf -04:00\nSystem.out.println(localDateTime.atZone(zoneId));\n// \u5982\u679c\u65f6\u95f4\u843d\u5728\u91cd\u53e0\u4e2d\u95f4\uff0c\u4ee5\u524d\u6709\u504f\u79fb\u91cf\u4e14\u66f4\u665a\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u665a\u7684\u504f\u79fb\u91cf\uff0c\u5373\u975e\u590f\u4ee4\u65f6\u504f\u79fb\u91cf -05:00\nSystem.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\nTransition[Overlap at 2022-11-06T02:00-04:00 to -05:00]\nnull\n2022-11-06T01:30-04:00[America/New_York]\n2022-11-06T02:30-05:00[America/New_York]\n')),(0,o.kt)("p",null,"\u8bf4\u201c\u91cd\u53e0\u6709\u4e24\u4e2a\u6709\u6548\u7684\u504f\u79fb\u91cf\u201d\uff0c\u662f\u56e0\u4e3a\u843d\u5728\u91cd\u53e0\u65f6\uff0c\u5982\u679c\u4ee5\u524d\u6ca1\u6709\u504f\u79fb\u91cf\u6216\u8005\u4ee5\u524d\u7684\u504f\u79fb\u91cf\u65e0\u6548\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u65e9\u7684\u504f\u79fb\u91cf\uff1b\u5982\u679c\u4ee5\u524d\u6709\u504f\u79fb\u91cf\u4e14\u66f4\u665a\u65f6\uff0c\u4f1a\u4f7f\u7528\u8f83\u665a\u7684\u504f\u79fb\u91cf\u3002"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"This is a ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html"},"value-based")," class; use of identity-sensitive operations (including reference equality (",(0,o.kt)("inlineCode",{parentName:"p"},"=="),"), identity hash code, or synchronization) on instances of ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," may have unpredictable results and should be avoided. The ",(0,o.kt)("inlineCode",{parentName:"p"},"equals")," method should be used for comparisons."),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u662f\u4e00\u4e2a ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html"},"value-based")," \u7c7b\uff1b\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u7684\u5b9e\u4f8b\u4e0a\u4f7f\u7528 identity-sensitive \u7684\u64cd\u4f5c\uff08\u5305\u62ec\u5f15\u7528\u76f8\u7b49",(0,o.kt)("inlineCode",{parentName:"p"},"=="),"\u3001identity hash code \u6216\u540c\u6b65 synchronization\uff09\u53ef\u80fd\u4f1a\u4ea7\u751f\u4e0d\u53ef\u9884\u6d4b\u7684\u7ed3\u679c\uff0c\u6240\u4ee5\u8981\u907f\u514d\u3002\u5e94\u8be5\u4f7f\u7528 equals \u65b9\u6cd5\u6765\u8fdb\u884c\u6bd4\u8f83\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"A ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," holds state equivalent to three separate objects, a ",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),", a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId")," and the resolved ",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),". The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid."),(0,o.kt)("p",{parentName:"blockquote"},"\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime"),"\u76f8\u5f53\u4e8e\u6301\u6709\u4e09\u4e2a\u72ec\u7acb\u5bf9\u8c61\u7684\u72b6\u6001\uff0c\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"LocalDateTime"),"\uff0c\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneId"),"\u548c\u5df2\u89e3\u51b3\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"ZoneOffset"),"\u3002\u5fc5\u8981\u65f6\uff0c\u504f\u79fb\u91cf\u548c local date-time \u88ab\u7528\u6765\u5b9a\u4e49\u4e00\u4e2a\u77ac\u95f4\u3002zone ID \u88ab\u7528\u6765\u83b7\u53d6\u504f\u79fb\u91cf\u53ca\u4f55\u65f6\u53d8\u5316\u7684\u89c4\u5219\u3002\u504f\u79fb\u91cf\u4e0d\u80fd\u81ea\u7531\u8bbe\u7f6e\uff0c\u56e0\u4e3a\u65f6\u533a\u63a7\u5236\u7740\u54ea\u4e9b\u504f\u79fb\u91cf\u65f6\u6709\u6548\u7684\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"This class is immutable and thread-safe."),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u7c7b\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u5e76\u4e14\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002")),(0,o.kt)("h2",{id:"withzonesamelocal-\u548c-withzonesameinstant-\u7684\u4f7f\u7528\u4e0e\u533a\u522b"},"withZoneSameLocal \u548c withZoneSameInstant \u7684\u4f7f\u7528\u4e0e\u533a\u522b"),(0,o.kt)("h3",{id:"withzonesamelocal-\u7b80\u4ecb"},"withZoneSameLocal \u7b80\u4ecb"),(0,o.kt)("p",null,"\u5148\u770b ",(0,o.kt)("inlineCode",{parentName:"p"},"withZoneSameLocal")," \u65b9\u6cd5\u7684\u6ce8\u91ca\uff1a"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible."),(0,o.kt)("p",{parentName:"blockquote"},"This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)"},"ofLocal(LocalDateTime, ZoneId, ZoneOffset)"),"."),(0,o.kt)("p",{parentName:"blockquote"},"To change the zone and adjust the local date-time, use ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)"},"withZoneSameInstant(ZoneId)"),"."),(0,o.kt)("p",{parentName:"blockquote"},"This instance is immutable and unaffected by this method call."),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@param")," ",(0,o.kt)("inlineCode",{parentName:"p"},"zone")," \u2013 the time-zone to change to, not null"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@return")," a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," based on this date-time with the requested zone, not null"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd4\u56de\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u65f6\u533a\u7684 date-time \u7684\u526f\u672c\uff0c\u5982\u679c\u53ef\u80fd\u7684\u8bdd\uff0c\u4fdd\u7559 local date-time\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u65b9\u6cd5\u6539\u53d8\u4e86\u65f6\u533a\u5e76\u4fdd\u7559\u4e86 local date-time\u3002\u5728\u65b0\u7684\u65f6\u533a\u65e0\u6548\u65f6\uff0clocal date-time \u624d\u4f1a\u88ab\u6539\u53d8\uff0c\u4e0e\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)"},"ofLocal(LocalDateTime, ZoneId, ZoneOffset)")," \u65b9\u6cd5\u76f8\u540c\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8981\u6539\u53d8\u533a\u57df\u5e76\u8c03\u6574 local date-time\uff0c\u8bf7\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)"},"withZoneSameInstant(ZoneId)"),"\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u88ab\u8c03\u7528\u5b9e\u4f8b\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u4e0d\u53d7\u6b64\u65b9\u6cd5\u8c03\u7528\u7684\u5f71\u54cd\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u5f62\u53c2"),"\uff1azone - \u8981\u6539\u53d8\u7684\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u8fd4\u56de\u503c"),"\uff1aa ZonedDateTime - \u57fa\u4e8e\u8be5 date-time \u7684\u8bf7\u6c42\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002")),(0,o.kt)("p",null,"\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u4fee\u6539\u65f6\u533a\u4f46\u662f\u4fdd\u6301 local date-time \u4e0d\u53d8\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'LocalDateTime localDateTime = LocalDateTime.now();\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));\nSystem.out.println(zonedDateTime);\nSystem.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of("Europe/Moscow")));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\n2022-08-08T18:45:22.711+08:00[Asia/Shanghai]\n2022-08-08T18:45:22.711+03:00[Europe/Moscow]\n')),(0,o.kt)("h3",{id:"withzonesameinstant-\u7b80\u4ecb"},"withZoneSameInstant \u7b80\u4ecb"),(0,o.kt)("p",null,"\u518d\u770b ",(0,o.kt)("inlineCode",{parentName:"p"},"withZoneSameInstant")," \u65b9\u6cd5\u6ce8\u91ca\uff1a"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Returns a copy of this date-time with a different time-zone, retaining the instant."),(0,o.kt)("p",{parentName:"blockquote"},"This method changes the time-zone and retains the instant. This normally results in a change to the local date-time."),(0,o.kt)("p",{parentName:"blockquote"},"This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result."),(0,o.kt)("p",{parentName:"blockquote"},"To change the offset while keeping the local time, use ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)"},"withZoneSameLocal(ZoneId)"),"."),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@param")," ",(0,o.kt)("inlineCode",{parentName:"p"},"zone")," \u2013 the time-zone to change to, not null"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@return")," a ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," based on this date-time with the requested zone, not null"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"@throws")," ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html"},"DateTimeException")," \u2013 if the result exceeds the supported date range"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd4\u56de\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u65f6\u533a\u7684 date-time \u7684\u526f\u672c\uff0c\u4fdd\u7559 instant\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u65b9\u6cd5\u6539\u53d8\u4e86\u65f6\u533a\u5e76\u4fdd\u7559\u4e86 instant\u3002\u8fd9\u901a\u5e38\u4f1a\u5bfc\u81f4 local date-time \u7684\u6539\u53d8\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8fd9\u4e2a\u65b9\u6cd5\u662f\u57fa\u4e8e\u4fdd\u7559\u76f8\u540c\u7684 instant\uff0c\u56e0\u6b64\u672c\u5730\u65f6\u95f4\u7ebf\u7684\u95f4\u6b47\u548c\u91cd\u53e0\u5bf9\u7ed3\u679c\u6ca1\u6709\u5f71\u54cd\u3002"),(0,o.kt)("p",{parentName:"blockquote"},"\u8981\u4fdd\u6301 local date-time \u7684\u540c\u65f6\u6539\u53d8\u504f\u79fb\u91cf\uff0c\u8bf7\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)"},"withZoneSameLocal(ZoneId)"),"\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u5f62\u53c2"),"\uff1a",(0,o.kt)("inlineCode",{parentName:"p"},"zone")," - \u8981\u6539\u53d8\u7684\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u8fd4\u56de\u503c"),"\uff1aa ",(0,o.kt)("inlineCode",{parentName:"p"},"ZonedDateTime")," - \u57fa\u4e8e\u8be5 date-time \u7684\u8bf7\u6c42\u65f6\u533a\uff0c\u4e0d\u4e3a null\u3002"),(0,o.kt)("p",{parentName:"blockquote"},(0,o.kt)("inlineCode",{parentName:"p"},"\u629b\u51fa"),"\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html"},"DateTimeException")," \u2013 \u5982\u679c\u7ed3\u679c\u8d85\u51fa\u4e86\u652f\u6301\u7684\u65e5\u671f\u8303\u56f4\u3002")),(0,o.kt)("p",null,"\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u4fee\u6539\u65f6\u533a\u4f46\u662f\u4fdd\u6301 instant \u4e0d\u53d8\u3002\u56e0\u4e3a\u65f6\u533a\u53d8\u4e86\uff0c\u504f\u79fb\u91cf\u80af\u5b9a\u53d8\u4e86\uff0c\u6240\u4ee5 local date-time \u4e5f\u4f1a\u6539\u53d8\u4ee5\u4fdd\u6301 instant \u4e0d\u53d8\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-java"},'LocalDateTime localDateTime = LocalDateTime.now();\nZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));\nSystem.out.println(zonedDateTime);\nSystem.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Moscow")));\n\n// \u8f93\u51fa\u7ed3\u679c\u4e3a\n2022-08-09T20:06:35.753+08:00[Asia/Shanghai]\n2022-08-09T15:06:35.753+03:00[Europe/Moscow]\n')),(0,o.kt)("h2",{id:""},"\u2026\u2026"),(0,o.kt)("h2",{id:"\u7591\u95ee"},"\u7591\u95ee"),(0,o.kt)("p",null,"\u6211\u4e86\u89e3\u7684\u5e76\u4e0d\u5168\u9762\uff0c\u6216\u8005\u662f\u56e0\u4e3a\u82f1\u8bed\u80fd\u529b\u6709\u9650\uff0c\u539f\u672c\u8981\u548c\u4e0a\u4e0b\u6587\u5173\u8054\u7406\u89e3\u7684\u5730\u65b9\u6ca1\u7ffb\u8bd1\u597d\uff0c\u5bfc\u81f4\u6211\u6709\u4ee5\u4e0b\u7591\u95ee\u3002\u5982\u679c\u4f60\u77e5\u9053\uff0c\u6b22\u8fce\u8054\u7cfb\u6211\uff01"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u6587\u4e2d\u201cor the previous offset is invalid\u201d\u3001\u201cThe local date-time is only changed if it is invalid for the new zone\u201d\u8fd9\u4e24\u6bb5\u8bdd\u7684\u65e0\u6548\u504f\u79fb\u91cf\u3001\u65f6\u533a\u5177\u4f53\u6307\u7684\u662f\u4ec0\u4e48\uff1f")),(0,o.kt)("h2",{id:"\u53c2\u8003"},"\u53c2\u8003"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93"},"\u65f6\u533a\u4fe1\u606f\u6570\u636e\u5e93 - \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"},"List of tz database time zones - Wikipedia")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6"},"\u590f\u4ee4\u65f6 - \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66"))))}d.isMDXComponent=!0},784:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png"}}]);
\ No newline at end of file
因为 它太大了无法显示 source diff 。你可以改为 查看blob
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
* @license MIT */
/**
* @license React
* use-sync-external-store-shim.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* Prism: Lightweight, robust, elegant syntax highlighting
*
* @license MIT <https://opensource.org/licenses/MIT>
* @author Lea Verou <https://lea.verou.me>
* @namespace
* @public
*/
/** @license React v0.20.2
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
(()=>{"use strict";var e,t,a,c,r,f={},o={};function d(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return f[e].call(a.exports,a,a.exports,d),a.loaded=!0,a.exports}d.m=f,d.c=o,e=[],d.O=(t,a,c,r)=>{if(!a){var f=1/0;for(i=0;i<e.length;i++){a=e[i][0],c=e[i][1],r=e[i][2];for(var o=!0,b=0;b<a.length;b++)(!1&r||f>=r)&&Object.keys(d.O).every((e=>d.O[e](a[b])))?a.splice(b--,1):(o=!1,r<f&&(f=r));if(o){e.splice(i--,1);var n=c();void 0!==n&&(t=n)}}return t}r=r||0;for(var i=e.length;i>0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[a,c,r]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var r=Object.create(null);d.r(r);var f={};t=t||[null,a({}),a([]),a(a)];for(var o=2&c&&e;"object"==typeof o&&!~t.indexOf(o);o=a(o))Object.getOwnPropertyNames(o).forEach((t=>f[t]=()=>e[t]));return f.default=()=>e,d.d(r,f),r},d.d=(e,t)=>{for(var a in t)d.o(t,a)&&!d.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,a)=>(d.f[a](e,t),t)),[])),d.u=e=>"assets/js/"+({13:"01a85c17",24:"4ef81f3e",28:"3d80bef5",39:"fb9566eb",53:"935f2afb",85:"1f391b9e",89:"a6aa9e1f",100:"d8276c15",103:"ccc49370",122:"d30705a1",220:"6b604096",236:"97c8416a",237:"1df93b7f",269:"8412c04d",282:"cbbaddc5",284:"4273ccc6",286:"c716eb39",352:"fa2d0ff0",381:"4911b796",391:"a82166f8",405:"20e4332b",414:"393be207",443:"ccb7bac2",514:"1be78505",535:"814f3328",562:"046f4051",588:"c38d8904",608:"9e4087bc",609:"62330588",610:"6875c492",663:"0a247007",675:"1c0203cd",685:"f501f602",687:"4ff7982f",740:"8c62e8b5",755:"c5325bcf",762:"5a20b735",814:"5c44bd63",817:"14eb3368",861:"8a3cff8a",908:"0a6ba43a",918:"17896441",953:"f9fe1258"}[e]||e)+"."+{13:"da95e277",24:"14d17d80",28:"bde96527",39:"331766f9",53:"7af150ee",85:"cbac6618",89:"7d66e53e",100:"39ad8072",103:"442da3aa",122:"3d8d3aeb",220:"505bed46",236:"2e10ac13",237:"98238d86",269:"cf93d9a2",282:"d6e96411",284:"f35f4a35",286:"7b38f057",352:"0b031d24",381:"62c02e29",391:"8413eeb8",405:"1846522f",414:"70f59f32",443:"9c9b5475",514:"030e5d49",529:"9353af9a",535:"f30bf200",562:"fc9e0324",588:"fb56db9c",608:"ed80ea45",609:"72e3ab5d",610:"0f5515fa",654:"8398be94",663:"81498a04",675:"8ed7418c",685:"99ee9c97",687:"c0d0420e",740:"13cf5e22",755:"92fdc9a6",762:"2d857bd8",814:"c4196345",817:"a7c1f1e7",861:"a4a0f847",908:"c3e35909",918:"bd1e10ac",953:"985e198d",972:"34e42ead"}[e]+".js",d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c={},r="zutil-docs:",d.l=(e,t,a,f)=>{if(c[e])c[e].push(t);else{var o,b;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==r+a){o=u;break}}o||(b=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,d.nc&&o.setAttribute("nonce",d.nc),o.setAttribute("data-webpack",r+a),o.src=e),c[e]=[t];var l=(t,a)=>{o.onerror=o.onload=null,clearTimeout(s);var r=c[e];if(delete c[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach((e=>e(a))),t)return t(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),b&&document.head.appendChild(o)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.p="/ZUtil/",d.gca=function(e){return e={17896441:"918",62330588:"609","01a85c17":"13","4ef81f3e":"24","3d80bef5":"28",fb9566eb:"39","935f2afb":"53","1f391b9e":"85",a6aa9e1f:"89",d8276c15:"100",ccc49370:"103",d30705a1:"122","6b604096":"220","97c8416a":"236","1df93b7f":"237","8412c04d":"269",cbbaddc5:"282","4273ccc6":"284",c716eb39:"286",fa2d0ff0:"352","4911b796":"381",a82166f8:"391","20e4332b":"405","393be207":"414",ccb7bac2:"443","1be78505":"514","814f3328":"535","046f4051":"562",c38d8904:"588","9e4087bc":"608","6875c492":"610","0a247007":"663","1c0203cd":"675",f501f602:"685","4ff7982f":"687","8c62e8b5":"740",c5325bcf:"755","5a20b735":"762","5c44bd63":"814","14eb3368":"817","8a3cff8a":"861","0a6ba43a":"908",f9fe1258:"953"}[e]||e,d.p+d.u(e)},(()=>{var e={303:0,532:0};d.f.j=(t,a)=>{var c=d.o(e,t)?e[t]:void 0;if(0!==c)if(c)a.push(c[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var r=new Promise(((a,r)=>c=e[t]=[a,r]));a.push(c[2]=r);var f=d.p+d.u(t),o=new Error;d.l(f,(a=>{if(d.o(e,t)&&(0!==(c=e[t])&&(e[t]=void 0),c)){var r=a&&("load"===a.type?"missing":a.type),f=a&&a.target&&a.target.src;o.message="Loading chunk "+t+" failed.\n("+r+": "+f+")",o.name="ChunkLoadError",o.type=r,o.request=f,c[1](o)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,a)=>{var c,r,f=a[0],o=a[1],b=a[2],n=0;if(f.some((t=>0!==e[t]))){for(c in o)d.o(o,c)&&(d.m[c]=o[c]);if(b)var i=b(d)}for(t&&t(a);n<f.length;n++)r=f[n],d.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return d.O(i)},a=self.webpackChunkzutil_docs=self.webpackChunkzutil_docs||[];a.forEach(t.bind(null,0)),a.push=t.bind(null,a.push.bind(a))})()})();
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">Blog | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="Blog | ZUtil"><meta data-rh="true" name="description" content="Blog"><meta data-rh="true" property="og:description" content="Blog"><meta data-rh="true" name="docusaurus_tag" content="blog_posts_list"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_posts_list"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-29T00:00:00.000Z" itemprop="datePublished">2022年7月29日</time> · <!-- -->阅读需 16 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value &quot;2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone&quot; can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;America/New_York&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from &quot;winter&quot; to &quot;summer&quot;. In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from &quot;summer&quot; to &quot;winter&quot;. In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically &quot;summer&quot; time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically &quot;summer&quot; time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/time">time</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/zone">zone</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时区">时区</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时间">时间</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/welcome">欢迎</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-16T00:00:00.000Z" itemprop="datePublished">2022年7月16日</time> · <!-- -->阅读需 1 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>Hello, World!</p><p>欢迎访问我的博客:<a href="http://blog.zhjh.top/" target="_blank" rel="noopener noreferrer">欲穷三千界的博客</a></p><h1>更快</h1><p>以下列出部分(封装第三方的不列)和 hutool(5.8+)的 JMH 对比测试(仅吞吐量,其他请查看源码),格式为:ZUtil 吞吐量 / hutool 吞吐量 = 快多少倍</p><ul><li>字符串转拼音:8.944 / 2.636 = 3.39</li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/hello">hello</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="博文列表分页导航"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">历史博文 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/archive"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="历史博文 | ZUtil"><meta data-rh="true" name="description" content="历史博文"><meta data-rh="true" property="og:description" content="历史博文"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/archive"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/archive" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/archive" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><header class="hero hero--primary"><div class="container"><h1 class="hero__title">历史博文</h1><p class="hero__subtitle">历史博文</p></div></header><main><section class="margin-vert--lg"><div class="container"><div class="row"><div class="col col--4 margin-vert--lg"><h3>2022</h3><ul><li><a href="/ZUtil/blog/javaTimeZone">2022年7月29日<!-- --> - <!-- -->java.time 时区详解</a></li><li><a href="/ZUtil/blog/welcome">2022年7月16日<!-- --> - <!-- -->欢迎</a></li></ul></div></div></div></section></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://duanluan.github.io/ZUtil/blog</id>
<title>ZUtil Blog</title>
<updated>2022-07-29T00:00:00.000Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://duanluan.github.io/ZUtil/blog"/>
<subtitle>ZUtil Blog</subtitle>
<icon>https://duanluan.github.io/ZUtil/img/favicon.ico</icon>
<entry>
<title type="html"><![CDATA[java.time 时区详解]]></title>
<id>https://duanluan.github.io/ZUtil/blog/javaTimeZone</id>
<link href="https://duanluan.github.io/ZUtil/blog/javaTimeZone"/>
<updated>2022-07-29T00:00:00.000Z</updated>
<summary type="html"><![CDATA[LocalDateTime类是不包含时区信息的,可以通过atZone方法来设置ZoneId,返回ZonedDateTime类实例,通过atOffset方法来设置ZoneOffset,返回OffsetDateTime类实例。]]></summary>
<content type="html"><![CDATA[<p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value "2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone" can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("America/New_York"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from "winter" to "summer". In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from "summer" to "winter". In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically "summer" time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically "summer" time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of("America/New_York");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of("America/New_York");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of("Europe/Moscow")));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Moscow")));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul>]]></content>
<author>
<name>ZhongJianhao</name>
<uri>https://github.com/duanluan</uri>
</author>
<category label="time" term="time"/>
<category label="zone" term="zone"/>
<category label="时区" term="时区"/>
<category label="时间" term="时间"/>
</entry>
<entry>
<title type="html"><![CDATA[欢迎]]></title>
<id>https://duanluan.github.io/ZUtil/blog/welcome</id>
<link href="https://duanluan.github.io/ZUtil/blog/welcome"/>
<updated>2022-07-16T00:00:00.000Z</updated>
<summary type="html"><![CDATA[Hello, World!]]></summary>
<content type="html"><![CDATA[<p>Hello, World!</p><p>欢迎访问我的博客:<a href="http://blog.zhjh.top/" target="_blank" rel="noopener noreferrer">欲穷三千界的博客</a></p><h1>更快</h1><p>以下列出部分(封装第三方的不列)和 hutool(5.8+)的 JMH 对比测试(仅吞吐量,其他请查看源码),格式为:ZUtil 吞吐量 / hutool 吞吐量 = 快多少倍</p><ul><li>字符串转拼音:8.944 / 2.636 = 3.39</li></ul>]]></content>
<author>
<name>ZhongJianhao</name>
<uri>https://github.com/duanluan</uri>
</author>
<category label="hello" term="hello"/>
</entry>
</feed>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">java.time 时区详解 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/javaTimeZone"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="java.time 时区详解 | ZUtil"><meta data-rh="true" name="description" content="LocalDateTime类是不包含时区信息的,可以通过atZone方法来设置ZoneId,返回ZonedDateTime类实例,通过atOffset方法来设置ZoneOffset,返回OffsetDateTime类实例。"><meta data-rh="true" property="og:description" content="LocalDateTime类是不包含时区信息的,可以通过atZone方法来设置ZoneId,返回ZonedDateTime类实例,通过atOffset方法来设置ZoneOffset,返回OffsetDateTime类实例。"><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2022-07-29T00:00:00.000Z"><meta data-rh="true" property="article:author" content="https://github.com/duanluan"><meta data-rh="true" property="article:tag" content="time,zone,时区,时间"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/javaTimeZone"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/javaTimeZone" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/javaTimeZone" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a aria-current="page" class="sidebarItemLink_mo7H sidebarItemLinkActive_I1ZP" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><article itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h1 class="title_f1Hy" itemprop="headline">java.time 时区详解</h1><div class="container_mt6G margin-vert--md"><time datetime="2022-07-29T00:00:00.000Z" itemprop="datePublished">2022年7月29日</time> · <!-- -->阅读需 16 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div id="post-content" class="markdown" itemprop="articleBody"><p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value &quot;2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone&quot; can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;America/New_York&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from &quot;winter&quot; to &quot;summer&quot;. In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from &quot;summer&quot; to &quot;winter&quot;. In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically &quot;summer&quot; time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically &quot;summer&quot; time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/time">time</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/zone">zone</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时区">时区</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时间">时间</a></li></ul></div><div class="col margin-top--sm"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-29-java.time-zone/001-java.time_时区详解.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="博文分页导航"><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/blog/welcome"><div class="pagination-nav__sublabel">较旧一篇</div><div class="pagination-nav__label">欢迎</div></a></nav></main><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#zoneddatetime-类注释详解" class="table-of-contents__link toc-highlight">ZonedDateTime 类注释详解</a></li><li><a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="table-of-contents__link toc-highlight">withZoneSameLocal 和 withZoneSameInstant 的使用与区别</a><ul><li><a href="#withzonesamelocal-简介" class="table-of-contents__link toc-highlight">withZoneSameLocal 简介</a></li><li><a href="#withzonesameinstant-简介" class="table-of-contents__link toc-highlight">withZoneSameInstant 简介</a></li></ul></li><li><a href="#" class="table-of-contents__link toc-highlight">……</a></li><li><a href="#疑问" class="table-of-contents__link toc-highlight">疑问</a></li><li><a href="#参考" class="table-of-contents__link toc-highlight">参考</a></li></ul></div></div></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>ZUtil Blog</title>
<link>https://duanluan.github.io/ZUtil/blog</link>
<description>ZUtil Blog</description>
<lastBuildDate>Fri, 29 Jul 2022 00:00:00 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>https://github.com/jpmonette/feed</generator>
<language>zh-Hans</language>
<item>
<title><![CDATA[java.time 时区详解]]></title>
<link>https://duanluan.github.io/ZUtil/blog/javaTimeZone</link>
<guid>https://duanluan.github.io/ZUtil/blog/javaTimeZone</guid>
<pubDate>Fri, 29 Jul 2022 00:00:00 GMT</pubDate>
<description><![CDATA[LocalDateTime类是不包含时区信息的,可以通过atZone方法来设置ZoneId,返回ZonedDateTime类实例,通过atOffset方法来设置ZoneOffset,返回OffsetDateTime类实例。]]></description>
<content:encoded><![CDATA[<p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value "2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone" can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("America/New_York"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from "winter" to "summer". In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from "summer" to "winter". In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically "summer" time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically "summer" time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of("America/New_York");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of("America/New_York");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of("Europe/Moscow")));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Moscow")));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul>]]></content:encoded>
<category>time</category>
<category>zone</category>
<category>时区</category>
<category>时间</category>
</item>
<item>
<title><![CDATA[欢迎]]></title>
<link>https://duanluan.github.io/ZUtil/blog/welcome</link>
<guid>https://duanluan.github.io/ZUtil/blog/welcome</guid>
<pubDate>Sat, 16 Jul 2022 00:00:00 GMT</pubDate>
<description><![CDATA[Hello, World!]]></description>
<content:encoded><![CDATA[<p>Hello, World!</p><p>欢迎访问我的博客:<a href="http://blog.zhjh.top/" target="_blank" rel="noopener noreferrer">欲穷三千界的博客</a></p><h1>更快</h1><p>以下列出部分(封装第三方的不列)和 hutool(5.8+)的 JMH 对比测试(仅吞吐量,其他请查看源码),格式为:ZUtil 吞吐量 / hutool 吞吐量 = 快多少倍</p><ul><li>字符串转拼音:8.944 / 2.636 = 3.39</li></ul>]]></content:encoded>
<category>hello</category>
</item>
</channel>
</rss>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-tags-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">标签 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/tags"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="标签 | ZUtil"><meta data-rh="true" name="docusaurus_tag" content="blog_tags_list"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_tags_list"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/tags"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><h1>标签</h1><section class="margin-vert--lg"><article><h2></h2><ul class="padding--none"><li class="tag_Nnez"><a class="tag_zVej tagWithCount_h2kH" href="/ZUtil/blog/tags/时间">时间<span>1</span></a></li><li class="tag_Nnez"><a class="tag_zVej tagWithCount_h2kH" href="/ZUtil/blog/tags/时区">时区<span>1</span></a></li></ul><hr></article><article><h2>H</h2><ul class="padding--none"><li class="tag_Nnez"><a class="tag_zVej tagWithCount_h2kH" href="/ZUtil/blog/tags/hello">hello<span>1</span></a></li></ul><hr></article><article><h2>T</h2><ul class="padding--none"><li class="tag_Nnez"><a class="tag_zVej tagWithCount_h2kH" href="/ZUtil/blog/tags/time">time<span>1</span></a></li></ul><hr></article><article><h2>Z</h2><ul class="padding--none"><li class="tag_Nnez"><a class="tag_zVej tagWithCount_h2kH" href="/ZUtil/blog/tags/zone">zone<span>1</span></a></li></ul><hr></article></section></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">1 篇博文 含有标签「hello」 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/tags/hello"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="1 篇博文 含有标签「hello」 | ZUtil"><meta data-rh="true" name="docusaurus_tag" content="blog_tags_posts"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_tags_posts"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/tags/hello"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/hello" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/hello" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><header class="margin-bottom--xl"><h1>1 篇博文 含有标签「hello」</h1><a href="/ZUtil/blog/tags">查看所有标签</a></header><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/welcome">欢迎</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-16T00:00:00.000Z" itemprop="datePublished">2022年7月16日</time> · <!-- -->阅读需 1 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>Hello, World!</p><p>欢迎访问我的博客:<a href="http://blog.zhjh.top/" target="_blank" rel="noopener noreferrer">欲穷三千界的博客</a></p><h1>更快</h1><p>以下列出部分(封装第三方的不列)和 hutool(5.8+)的 JMH 对比测试(仅吞吐量,其他请查看源码),格式为:ZUtil 吞吐量 / hutool 吞吐量 = 快多少倍</p><ul><li>字符串转拼音:8.944 / 2.636 = 3.39</li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/hello">hello</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="博文列表分页导航"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">1 篇博文 含有标签「time」 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/tags/time"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="1 篇博文 含有标签「time」 | ZUtil"><meta data-rh="true" name="docusaurus_tag" content="blog_tags_posts"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_tags_posts"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/tags/time"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/time" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/time" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><header class="margin-bottom--xl"><h1>1 篇博文 含有标签「time」</h1><a href="/ZUtil/blog/tags">查看所有标签</a></header><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-29T00:00:00.000Z" itemprop="datePublished">2022年7月29日</time> · <!-- -->阅读需 16 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value &quot;2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone&quot; can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;America/New_York&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from &quot;winter&quot; to &quot;summer&quot;. In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from &quot;summer&quot; to &quot;winter&quot;. In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically &quot;summer&quot; time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically &quot;summer&quot; time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/time">time</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/zone">zone</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时区">时区</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时间">时间</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="博文列表分页导航"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">1 篇博文 含有标签「zone」 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/tags/zone"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="1 篇博文 含有标签「zone」 | ZUtil"><meta data-rh="true" name="docusaurus_tag" content="blog_tags_posts"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_tags_posts"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/tags/zone"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/zone" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/zone" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><header class="margin-bottom--xl"><h1>1 篇博文 含有标签「zone」</h1><a href="/ZUtil/blog/tags">查看所有标签</a></header><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-29T00:00:00.000Z" itemprop="datePublished">2022年7月29日</time> · <!-- -->阅读需 16 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value &quot;2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone&quot; can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;America/New_York&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from &quot;winter&quot; to &quot;summer&quot;. In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from &quot;summer&quot; to &quot;winter&quot;. In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically &quot;summer&quot; time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically &quot;summer&quot; time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/time">time</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/zone">zone</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时区">时区</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时间">时间</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="博文列表分页导航"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">1 篇博文 含有标签「时区」 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/tags/时区"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="1 篇博文 含有标签「时区」 | ZUtil"><meta data-rh="true" name="docusaurus_tag" content="blog_tags_posts"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_tags_posts"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/tags/时区"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/时区" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/时区" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><header class="margin-bottom--xl"><h1>1 篇博文 含有标签「时区」</h1><a href="/ZUtil/blog/tags">查看所有标签</a></header><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-29T00:00:00.000Z" itemprop="datePublished">2022年7月29日</time> · <!-- -->阅读需 16 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value &quot;2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone&quot; can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;America/New_York&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from &quot;winter&quot; to &quot;summer&quot;. In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from &quot;summer&quot; to &quot;winter&quot;. In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically &quot;summer&quot; time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically &quot;summer&quot; time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/time">time</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/zone">zone</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时区">时区</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时间">时间</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="博文列表分页导航"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">1 篇博文 含有标签「时间」 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/tags/时间"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" property="og:title" content="1 篇博文 含有标签「时间」 | ZUtil"><meta data-rh="true" name="docusaurus_tag" content="blog_tags_posts"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_tags_posts"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/tags/时间"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/时间" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/tags/时间" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><header class="margin-bottom--xl"><h1>1 篇博文 含有标签「时间」</h1><a href="/ZUtil/blog/tags">查看所有标签</a></header><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-07-29T00:00:00.000Z" itemprop="datePublished">2022年7月29日</time> · <!-- -->阅读需 16 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p><code>LocalDateTime</code>类是不包含时区信息的,可以通过<code>atZone</code>方法来设置<code>ZoneId</code>,返回<code>ZonedDateTime</code>类实例,通过<code>atOffset</code>方法来设置<code>ZoneOffset</code>,返回<code>OffsetDateTime</code>类实例。</p><p><img loading="lazy" src="/ZUtil/assets/images/java.time.drawio-f8bd73a2d32a84f8214ddba9bbc988d5.png" width="506" height="232" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zoneddatetime-类注释详解">ZonedDateTime 类注释详解<a href="#zoneddatetime-类注释详解" class="hash-link" aria-label="ZonedDateTime 类注释详解的直接链接" title="ZonedDateTime 类注释详解的直接链接"></a></h2><p>我们来逐段解读一下 ZonedDateTime 类的注释。</p><blockquote><p>A date-time with a time-zone in the ISO-8601 calendar system, such as <code>2007-12-03T10:15:30+01:00 Europe/Paris</code>.</p><p>ISO-8601 日历系统中带时区的日期时间,例如<code>2007-12-03T10:15:30+01:00 Europe/Paris</code></p></blockquote><p><a href="https://zh.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO-8601</a> 我们简单理解为是规定日期和时间如何表示的标准即可,此处不深入研究。</p><p><code>2007-12-03T10:15:30+01:00 Europe/Paris</code>中,<code>2007-12-03</code>为年月日;<code>T</code>是日期和时间组合表示时的固定写法,用于分隔;<code>10:15:30</code>是小时分钟秒;<code>+01:00</code>是此日期时间与 UTC 的时差为 +1 小时,即<strong>时区偏移(ZoneOffset)</strong><code>Europe/Paris</code>是指此日期时间的所在区域为欧洲/巴黎,即<strong>时区 ID(ZoneId)</strong>,time-zone ID 请查看:<a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones</a></p><blockquote><p>ZonedDateTime is an immutable representation of a date-time with a time-zone. This class stores all date and time fields, to a precision of nanoseconds, and a time-zone, with a zone offset used to handle ambiguous local date-times. For example, the value &quot;2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone&quot; can be stored in a <code>ZonedDateTime</code>.</p><p>ZonedDateTime 是带时区的日期时间的常量表示。此类存储所有的日期时间(精确到纳秒)和时区,其中时区偏移用于处理不明确的本地日期时间。 例如,值“2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone” 可以被存储在<code>ZonedDateTime</code>中。</p></blockquote><p>说它是常量是因为此类是被<code>final</code>修饰的,调用它的方法时,<strong>返回</strong>的都是<strong>新实例</strong></p><p>“时区偏移用于处理不明确的本地日期时间”,之所以不明确,是因为<a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时</a>的存在,同一地区,不同月份,甚至不同年份的 ZoneOffset 可能不一样。详见<a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库</a></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置时区 ID 为 美国/纽约</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;America/New_York&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 设置月份为 4 月,即夏令时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zonedDateTime = zonedDateTime.withMonth(4);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出为 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.getOffset());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>This class handles conversion from the local time-line of <code>LocalDateTime</code> to the instant time-line of <code>Instant</code>. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a <code>ZoneOffset</code>.</p><p>此类处理<code>LocalDateTime</code>的本地时间线到<code>Instant</code>的瞬时时间线。两条时间线的差异是与 UTC/Greenwich 的偏移量,由<code>ZoneOffset</code>表示。</p></blockquote><p><strong>Instant(瞬时)</strong>简单来说就是 java.time 中的时间戳(精度为纳秒),不包含时区信息。</p><p>此处说“两条时间线的差异是与 UTC/Greenwich 的偏移量”是指 Instant 加上 ZoneOffset 就可以获取 LocalDateTime。但如果是要将 Instant 转换为 ZonedDateTime 的话,需要设置 ZoneId。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Instant instant = Instant.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = instant.atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Converting between the two time-lines involves calculating the offset using the <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">rules</a> accessed from the <code>ZoneId</code>. Obtaining the offset for an instant is simple, as there is exactly one valid offset for each instant. By contrast, obtaining the offset for a local date-time is not straightforward. There are three cases:</p><ul><li>Normal, with one valid offset. For the vast majority of the year, the normal case applies, where there is a single valid offset for the local date-time.</li><li>Gap, with zero valid offsets. This is when clocks jump forward typically due to the spring daylight savings change from &quot;winter&quot; to &quot;summer&quot;. In a gap there are local date-time values with no valid offset.</li><li>Overlap, with two valid offsets. This is when clocks are set back typically due to the autumn daylight savings change from &quot;summer&quot; to &quot;winter&quot;. In an overlap there are local date-time values with two valid offsets.</li></ul><p>两条时间线之间的转换涉及到使用<code>ZoneId</code>访问<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/zone/ZoneRules.html" target="_blank" rel="noopener noreferrer">规则</a>(ZoneRules)计算偏移量。获取一个 instant 的偏移量很简单,因为每个 instant 正好有一个有效偏移量。相比之下,获取一个 local date-time 的有效偏移量
并不简单。有三种情况:</p><ul><li>正常:有一个有效的偏移量。在一年中的绝大多数时间里,local date-time 有一个有效的偏移量。</li><li>间隙:没有有效的偏移量。这是由于春季夏令时从“冬季”到“夏季”,时钟被调快了,跳过了一段时间。在跳过的间隙中,有 local date-time,但没有有效的偏移量。</li><li>重叠:有两个有效的偏移量。这是由于秋季夏令时从“夏季”到“冬季”,时钟往回调了一段时间。在重叠的情况下,有两个有效的偏移量的 local date-time。</li></ul><p>Any method that converts directly or implicitly from a local date-time to an instant by obtaining the offset has the potential to be complicated.</p><p>For Gaps, the general strategy is that if the local date-time falls in the middle of a Gap, then the resulting zoned date-time will have a local date-time shifted forwards by the length of the Gap, resulting in a date-time in the later offset, typically &quot;summer&quot; time.</p><p>For Overlaps, the general strategy is that if the local date-time falls in the middle of an Overlap, then the previous offset will be retained. If there is no previous offset, or the previous offset is invalid, then the earlier offset is used, typically &quot;summer&quot; time.. Two additional methods, <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>, help manage the case of an overlap.</p><p>任何通过获取偏移量显式或隐式地将 local date-time 转换为 instant 地方都有可能变得复杂。</p><p>对于间隙,一般策略是,如果 local date-time 落在间隙中间,那么产生的 zoned date-time 是 local date-time 向前移动间歇的长度后的,导致日期在较晚的偏移量,通常是“夏季”时间。</p><p>对于重叠,一般策略是,如果 local date-time 落在重叠中间,那么以前的偏移量将被保留。如果以前没有偏移量,或者以前的偏移量无效,那么就使用较早的偏移量,通常是“夏季”时间。两个额外的方法,<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withEarlierOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withEarlierOffsetAtOverlap()</a> and <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap()" target="_blank" rel="noopener noreferrer">withLaterOffsetAtOverlap()</a>,可以帮助管理重合的情况。</p><p>In terms of design, this class should be viewed primarily as the combination of a <code>LocalDateTime</code> and a <code>ZoneId</code>. The <code>ZoneOffset</code> is a vital, but secondary, piece of information, used to ensure that the class represents an instant, especially during a daylight savings overlap.</p><p>就设计而言,这个类应该主要被看作是<code>LocalDateTime</code><code>ZoneId</code>的组合。<code>ZoneOffset</code>是一个重要但次要的信息,用来确保这个类代表一个瞬间,特别是在夏令时重叠的时候。</p></blockquote><p>此处举例,美国夏令时一般在 <strong>3 月第二个周日 2AM</strong> 开始,将时钟拨快 1 小时,调到 3 点,那这一小时就是“冬季”到“夏季”的<strong>间隙(Gap)</strong>;在 <strong>11 月第一个周日 2AM</strong>,又会将时钟拨慢 1 小时,调回到 1 点,那这一小时就是“夏季”到“冬季”的<strong>重叠(Overlap)</strong></p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时间歇时间为 03-13 02:00 ~ 03:00(不包含 03:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 13, 2, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在间歇中间,那对应的 zoned date-time 会加上间歇长度(此处为 1 小时),同时时区偏移量为夏令时偏移量。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Gap at 2022-03-13T02:00-05:00 to -04:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-03-13T03:30-04:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“间歇没有有效的偏移量”,是因为落在间歇再转换为 zoned date-time 后,会自动加上间歇长度,所以那段时间只有 local date-time,没有偏移量。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ZoneId zoneId = ZoneId.of(&quot;America/New_York&quot;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneRules zoneRules = zoneId.getRules();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 美国/纽约 2022 年的夏令时重叠时间为 11-06 01:00 ~ 02:00(不包含 02:00)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 6, 1, 30);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZoneOffsetTransition zoneRulesTransition = zoneRules.getTransition(localDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRulesTransition);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zoneRules.getTransition(localDateTime.plusMinutes(30)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量,即夏令时偏移量 -04:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atZone(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 如果时间落在重叠中间,以前有偏移量且更晚时,会使用较晚的偏移量,即非夏令时偏移量 -05:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(localDateTime.atOffset(ZoneOffset.ofHours(-6)).atZoneSameInstant(zoneId));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Transition[Overlap at 2022-11-06T02:00-04:00 to -05:00]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">null</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T01:30-04:00[America/New_York]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-11-06T02:30-05:00[America/New_York]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>说“重叠有两个有效的偏移量”,是因为落在重叠时,如果以前没有偏移量或者以前的偏移量无效时,会使用较早的偏移量;如果以前有偏移量且更晚时,会使用较晚的偏移量。</p><blockquote><p>This is a <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> class; use of identity-sensitive operations (including reference equality (<code>==</code>), identity hash code, or synchronization) on instances of <code>ZonedDateTime</code> may have unpredictable results and should be avoided. The <code>equals</code> method should be used for comparisons.</p><p>这是一个 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html" target="_blank" rel="noopener noreferrer">value-based</a> 类;在<code>ZonedDateTime</code>的实例上使用 identity-sensitive 的操作(包括引用相等<code>==</code>、identity hash code 或同步 synchronization)可能会产生不可预测的结果,所以要避免。应该使用 equals 方法来进行比较。</p><p>A <code>ZonedDateTime</code> holds state equivalent to three separate objects, a <code>LocalDateTime</code>, a <code>ZoneId</code> and the resolved <code>ZoneOffset</code>. The offset and local date-time are used to define an instant when necessary. The zone ID is used to obtain the rules for how and when the offset changes. The offset cannot be freely set, as the zone controls which offsets are valid.</p><p>一个<code>ZonedDateTime</code>相当于持有三个独立对象的状态,一个<code>LocalDateTime</code>,一个<code>ZoneId</code>和已解决的<code>ZoneOffset</code>。必要时,偏移量和 local date-time 被用来定义一个瞬间。zone ID 被用来获取偏移量及何时变化的规则。偏移量不能自由设置,因为时区控制着哪些偏移量时有效的。</p><p>This class is immutable and thread-safe.</p><p>这个类是不可变的,并且是线程安全的。</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-和-withzonesameinstant-的使用与区别">withZoneSameLocal 和 withZoneSameInstant 的使用与区别<a href="#withzonesamelocal-和-withzonesameinstant-的使用与区别" class="hash-link" aria-label="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接" title="withZoneSameLocal 和 withZoneSameInstant 的使用与区别的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesamelocal-简介">withZoneSameLocal 简介<a href="#withzonesamelocal-简介" class="hash-link" aria-label="withZoneSameLocal 简介的直接链接" title="withZoneSameLocal 简介的直接链接"></a></h3><p>先看 <code>withZoneSameLocal</code> 方法的注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the local date-time if possible.</p><p>This method changes the time-zone and retains the local date-time. The local date-time is only changed if it is invalid for the new zone, determined using the same approach as <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a>.</p><p>To change the zone and adjust the local date-time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a>.</p><p>This instance is immutable and unaffected by this method call.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p>返回一个具有不同时区的 date-time 的副本,如果可能的话,保留 local date-time。</p><p>这个方法改变了时区并保留了 local date-time。在新的时区无效时,local date-time 才会被改变,与使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#ofLocal(java.time.LocalDateTime,java.time.ZoneId,java.time.ZoneOffset)" target="_blank" rel="noopener noreferrer">ofLocal(LocalDateTime, ZoneId, ZoneOffset)</a> 方法相同。</p><p>要改变区域并调整 local date-time,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameInstant(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameInstant(ZoneId)</a></p><p>被调用实例是不可变的,不受此方法调用的影响。</p><p><code>形参</code>:zone - 要改变的时区,不为 null。</p><p><code>返回值</code>:a ZonedDateTime - 基于该 date-time 的请求时区,不为 null。</p></blockquote><p>简单来说就是修改时区但是保持 local date-time 不变:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameLocal(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-08T18:45:22.711+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="withzonesameinstant-简介">withZoneSameInstant 简介<a href="#withzonesameinstant-简介" class="hash-link" aria-label="withZoneSameInstant 简介的直接链接" title="withZoneSameInstant 简介的直接链接"></a></h3><p>再看 <code>withZoneSameInstant</code> 方法注释:</p><blockquote><p>Returns a copy of this date-time with a different time-zone, retaining the instant.</p><p>This method changes the time-zone and retains the instant. This normally results in a change to the local date-time.</p><p>This method is based on retaining the same instant, thus gaps and overlaps in the local time-line have no effect on the result.</p><p>To change the offset while keeping the local time, use <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a>.</p><p><code>@param</code> <code>zone</code> – the time-zone to change to, not null</p><p><code>@return</code> a <code>ZonedDateTime</code> based on this date-time with the requested zone, not null</p><p><code>@throws</code> <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – if the result exceeds the supported date range</p><p>返回一个具有不同时区的 date-time 的副本,保留 instant。</p><p>这个方法改变了时区并保留了 instant。这通常会导致 local date-time 的改变。</p><p>这个方法是基于保留相同的 instant,因此本地时间线的间歇和重叠对结果没有影响。</p><p>要保持 local date-time 的同时改变偏移量,请使用 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZonedDateTime.html#withZoneSameLocal(java.time.ZoneId)" target="_blank" rel="noopener noreferrer">withZoneSameLocal(ZoneId)</a></p><p><code>形参</code><code>zone</code> - 要改变的时区,不为 null。</p><p><code>返回值</code>:a <code>ZonedDateTime</code> - 基于该 date-time 的请求时区,不为 null。</p><p><code>抛出</code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/DateTimeException.html" target="_blank" rel="noopener noreferrer">DateTimeException</a> – 如果结果超出了支持的日期范围。</p></blockquote><p>简单来说就是修改时区但是保持 instant 不变。因为时区变了,偏移量肯定变了,所以 local date-time 也会改变以保持 instant 不变。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LocalDateTime localDateTime = LocalDateTime.now();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of(&quot;Asia/Shanghai&quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(zonedDateTime.withZoneSameInstant(ZoneId.of(&quot;Europe/Moscow&quot;)));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T20:06:35.753+08:00[Asia/Shanghai]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2022-08-09T15:06:35.753+03:00[Europe/Moscow]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2>……</h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="疑问">疑问<a href="#疑问" class="hash-link" aria-label="疑问的直接链接" title="疑问的直接链接"></a></h2><p>我了解的并不全面,或者是因为英语能力有限,原本要和上下文关联理解的地方没翻译好,导致我有以下疑问。如果你知道,欢迎联系我!</p><ul><li>文中“or the previous offset is invalid”、“The local date-time is only changed if it is invalid for the new zone”这两段话的无效偏移量、时区具体指的是什么?</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考">参考<a href="#参考" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接"></a></h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA%E4%BF%A1%E6%81%AF%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener noreferrer">时区信息数据库 - 维基百科,自由的百科全书</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" target="_blank" rel="noopener noreferrer">List of tz database time zones - Wikipedia</a></li><li><a href="https://zh.wikipedia.org/wiki/%E5%A4%8F%E4%BB%A4%E6%97%B6" target="_blank" rel="noopener noreferrer">夏令时 - 维基百科,自由的百科全书</a></li></ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/time">time</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/zone">zone</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时区">时区</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/时间">时间</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="博文列表分页导航"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">欢迎 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/blog/welcome"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="欢迎 | ZUtil"><meta data-rh="true" name="description" content="Hello, World!"><meta data-rh="true" property="og:description" content="Hello, World!"><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2022-07-16T00:00:00.000Z"><meta data-rh="true" property="article:author" content="https://github.com/duanluan"><meta data-rh="true" property="article:tag" content="hello"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/blog/welcome"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/welcome" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/blog/welcome" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="最近博文导航"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/ZUtil/blog/javaTimeZone">java.time 时区详解</a></li><li class="sidebarItem__DBe"><a aria-current="page" class="sidebarItemLink_mo7H sidebarItemLinkActive_I1ZP" href="/ZUtil/blog/welcome">欢迎</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><article itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h1 class="title_f1Hy" itemprop="headline">欢迎</h1><div class="container_mt6G margin-vert--md"><time datetime="2022-07-16T00:00:00.000Z" itemprop="datePublished">2022年7月16日</time> · <!-- -->阅读需 1 分钟</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/duanluan.png" alt="ZhongJianhao"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/duanluan" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">ZhongJianhao</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of ZUtil</small></div></div></div></div></header><div id="post-content" class="markdown" itemprop="articleBody"><p>Hello, World!</p><p>欢迎访问我的博客:<a href="http://blog.zhjh.top/" target="_blank" rel="noopener noreferrer">欲穷三千界的博客</a></p><h1>更快</h1><p>以下列出部分(封装第三方的不列)和 hutool(5.8+)的 JMH 对比测试(仅吞吐量,其他请查看源码),格式为:ZUtil 吞吐量 / hutool 吞吐量 = 快多少倍</p><ul><li>字符串转拼音:8.944 / 2.636 = 3.39</li></ul></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>标签:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/ZUtil/blog/tags/hello">hello</a></li></ul></div><div class="col margin-top--sm"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/blog/2022-07-16-welcome/index.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="博文分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/blog/javaTimeZone"><div class="pagination-nav__sublabel">较新一篇</div><div class="pagination-nav__label">java.time 时区详解</div></a></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">date 时间 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/category/date-时间"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="date 时间 | ZUtil"><meta data-rh="true" name="description" content="Date"><meta data-rh="true" property="og:description" content="Date"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/category/date-时间"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/category/date-时间" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/category/date-时间" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" aria-expanded="true" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/constant">constant 常量</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateUtils">DateUtils 时间工具类</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateFeature">DateFeature 时间特性</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="generatedIndexPage_vN6x"><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/参考手册"><span itemprop="name">参考手册</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">date 时间</span><meta itemprop="position" content="2"></li></ul></nav><header><h1 class="title_kItE">date 时间</h1><p>Date</p></header><article class="margin-top--lg"><section class="row list_eTzJ"><article class="col col--6 margin-bottom--lg"><a class="card padding--lg cardContainer_fWXF" href="/ZUtil/docs/reference-doc/date/constant"><h2 class="text--truncate cardTitle_rnsV" title="constant 常量">📄️<!-- --> <!-- -->constant 常量</h2><p class="text--truncate cardDescription_PWke" title="DateConstant - 时间常量">DateConstant - 时间常量</p></a></article><article class="col col--6 margin-bottom--lg"><a class="card padding--lg cardContainer_fWXF" href="/ZUtil/docs/reference-doc/date/dateUtils"><h2 class="text--truncate cardTitle_rnsV" title="DateUtils 时间工具类">📄️<!-- --> <!-- -->DateUtils 时间工具类</h2><p class="text--truncate cardDescription_PWke" title="继承org.apache.commons.lang3.time.DateUtils。">继承org.apache.commons.lang3.time.DateUtils。</p></a></article><article class="col col--6 margin-bottom--lg"><a class="card padding--lg cardContainer_fWXF" href="/ZUtil/docs/reference-doc/date/dateFeature"><h2 class="text--truncate cardTitle_rnsV" title="DateFeature 时间特性">📄️<!-- --> <!-- -->DateFeature 时间特性</h2><p class="text--truncate cardDescription_PWke" title="可以通过临时或总是(Always)修改其静态成员变量,来决定 DateUtils 中方法对时间的处理方式。">可以通过临时或总是(Always)修改其静态成员变量,来决定 DateUtils 中方法对时间的处理方式。</p></a></article></section></article><footer class="margin-top--lg"><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/category/参考手册"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">参考手册</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/reference-doc/date/constant"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">constant 常量</div></a></nav></footer></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">pinyin 拼音 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/category/pinyin-拼音"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="pinyin 拼音 | ZUtil"><meta data-rh="true" name="description" content="Pinyin"><meta data-rh="true" property="og:description" content="Pinyin"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/category/pinyin-拼音"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/category/pinyin-拼音" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/category/pinyin-拼音" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" aria-expanded="true" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/pinyin/pinyinFeature">PinyinFeature 拼音特性</a></li></ul></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="generatedIndexPage_vN6x"><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/参考手册"><span itemprop="name">参考手册</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">pinyin 拼音</span><meta itemprop="position" content="2"></li></ul></nav><header><h1 class="title_kItE">pinyin 拼音</h1><p>Pinyin</p></header><article class="margin-top--lg"><section class="row list_eTzJ"><article class="col col--6 margin-bottom--lg"><a class="card padding--lg cardContainer_fWXF" href="/ZUtil/docs/reference-doc/pinyin/pinyinFeature"><h2 class="text--truncate cardTitle_rnsV" title="PinyinFeature 拼音特性">📄️<!-- --> <!-- -->PinyinFeature 拼音特性</h2><p class="text--truncate cardDescription_PWke" title="可以通过临时或总是(Always)修改其静态成员变量,来决定 PinyinUtils 中方法对拼音的处理方式。">可以通过临时或总是(Always)修改其静态成员变量,来决定 PinyinUtils 中方法对拼音的处理方式。</p></a></article></section></article><footer class="margin-top--lg"><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/reference-doc/date/dateFeature"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">DateFeature 时间特性</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/reference-doc/pinyin/pinyinFeature"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">PinyinFeature 拼音特性</div></a></nav></footer></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">参考手册 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/category/参考手册"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="参考手册 | ZUtil"><meta data-rh="true" name="description" content="Reference Doc"><meta data-rh="true" property="og:description" content="Reference Doc"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/category/参考手册"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/category/参考手册" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/category/参考手册" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="generatedIndexPage_vN6x"><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">参考手册</span><meta itemprop="position" content="1"></li></ul></nav><header><h1 class="title_kItE">参考手册</h1><p>Reference Doc</p></header><article class="margin-top--lg"><section class="row list_eTzJ"><article class="col col--6 margin-bottom--lg"><a class="card padding--lg cardContainer_fWXF" href="/ZUtil/docs/category/date-时间"><h2 class="text--truncate cardTitle_rnsV" title="date 时间">🗃️<!-- --> <!-- -->date 时间</h2><p class="text--truncate cardDescription_PWke" title="3 个项目">3 个项目</p></a></article><article class="col col--6 margin-bottom--lg"><a class="card padding--lg cardContainer_fWXF" href="/ZUtil/docs/category/pinyin-拼音"><h2 class="text--truncate cardTitle_rnsV" title="pinyin 拼音">🗃️<!-- --> <!-- -->pinyin 拼音</h2><p class="text--truncate cardDescription_PWke" title="1 个项目">1 个项目</p></a></article></section></article><footer class="margin-top--lg"><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/introduction"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">入门</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/category/date-时间"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">date 时间</div></a></nav></footer></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-incompatible-changes">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">不兼容变更 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/incompatible-changes"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="不兼容变更 | ZUtil"><meta data-rh="true" name="description" content="* 1.12.0"><meta data-rh="true" property="og:description" content="* 1.12.0"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/incompatible-changes"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/incompatible-changes" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/incompatible-changes" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">不兼容变更</span><meta itemprop="position" content="1"></li></ul></nav><div class="theme-doc-markdown markdown"><h1>不兼容变更</h1><ul><li>1.12.0<ul><li><code>ClassUtils.isBasic</code>重命名为<code>isPrimitiveType</code></li><li><code>BeanUtils</code>移至<code>bean</code>包下。</li><li><code>BeanUtils.FieldFunction</code>重命名为<code>PropertyFunction</code>并移至根包下。</li><li><code>BeanUtils.getFieldName(FieldFunction)</code>重命名为<code>getPropertyName(PropertyFunction)</code></li><li>删除<code>BeanUtils.deepToMap</code></li></ul></li><li>1.11.0<ul><li>Group Id 由<code>top.zhogjianhao</code>重命名为<code>top.csaf</code></li></ul></li><li>1.10.1<ul><li><code>id.NanoIDUtils</code>重命名为<code>NanoIdUtils</code></li></ul></li><li>1.9.2<ul><li>删除<code>FileUtils.getClassRootPath</code></li><li>删除<code>FileUtils.getClassPath</code></li><li><code>FileUtils</code>移至<code>io</code>包下。</li></ul></li><li>1.8.1<ul><li><code>date.DateFeature</code>中静态变量的赋值方式由直接赋值改为通过<code>set</code><code>setAlways</code>方法赋值;</li><li><code>DateUtils.defaultLocalDatePattern</code>移至<code>DateConstant.DEFAULT_LOCAL_DATE_PATTERN</code></li><li><code>DateUtils.defaultLocalDateTimePattern</code>移至<code>DateConstant.DEFAULT_LOCAL_DATE_TIME_PATTERN</code></li><li><code>DateUtils.defaultLocalTimePattern</code>移至<code>DateConstant.DEFAULT_LOCAL_TIME_PATTERN</code></li></ul></li><li>1.8.0<ul><li><code>date.DateDuration</code>移至<code>date.constant</code>包下;</li><li><code>date.DatePattern</code>移至<code>date.constant</code>包下;</li><li><code>date.DatePatternRegex</code>移至<code>date.constant.DateRegexPattern</code></li><li><code>constant.CommonPatternConstant</code>重命名为<code>PatternConstant</code>;</li><li><code>RegExUtils</code>移至<code>regex</code>包下。</li></ul></li><li>1.7.0<ul><li><code>JsonUtils</code><code>toJson(Object, SerializerFeature...)</code><code>parseObject(String, Class&lt;T&gt;, Feature...)</code><code>parseObject(String, Class&lt;T&gt;, ParserConfig)</code>方法,SerializerFeature... 替换为 <strong>JSONWriter.Feature...</strong>,Feature... 和 ParserConfig 替换为 <strong>JSONReader.Feature...</strong></li></ul></li><li>1.5.1<ul><li>删除<code>ArrayUtils#indexOf(String[], String, int)</code></li></ul></li><li>1.2.4<ul><li><code>DateUtils</code>移至<code>date</code>包下。</li></ul></li><li>1.2.0<ul><li><code>CollectionUtils</code><code>moveForward、remove</code>方法,移至<code>ArrayUtils</code>中并重构优化。</li></ul></li></ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/999-incompatible-changes.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/reference-doc/pinyin/pinyinFeature"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">PinyinFeature 拼音特性</div></a></nav></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-intro">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">介绍 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/intro"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="介绍 | ZUtil"><meta data-rh="true" name="description" content="简介"><meta data-rh="true" property="og:description" content="简介"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/intro"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/intro" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/intro" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">介绍</span><meta itemprop="position" content="1"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>介绍</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="简介">简介<a href="#简介" class="hash-link" aria-label="简介的直接链接" title="简介的直接链接"></a></h2><p>追求更快更全的 Java 工具类。</p><p>本文档只会介绍常用及特色功能,具体使用请查看 <a href="https://apidoc.gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer">javadoc</a></p><p>和 Hutool 的性能对比测试可以查看 <a href="https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/jmh/contrast" target="_blank" rel="noopener noreferrer">jmh.contrast</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="资源">资源<a href="#资源" class="hash-link" aria-label="资源的直接链接" title="资源的直接链接"></a></h2><ul><li><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a></li><li><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer">Gitee</a>(仓库评论即可)</li><li><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer">QQ 群</a></li><li><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer">SegmentFault 问答</a><a href="https://segmentfault.com/u/duanluan" target="_blank" rel="noopener noreferrer">关注后提问题时邀请回答</a></li><li><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer">开源中国问答</a><a href="https://www.oschina.net/question/ask?user=2353983" target="_blank" rel="noopener noreferrer">向我提问</a></li><li><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer">CSDN 问答</a><a href="https://blog.csdn.net/duanluan" target="_blank" rel="noopener noreferrer">关注后提问题时 @ 邀请回答</a></li></ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/001-intro.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/introduction"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">入门</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#简介" class="table-of-contents__link toc-highlight">简介</a></li><li><a href="#资源" class="table-of-contents__link toc-highlight">资源</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-introduction">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">入门 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/introduction"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="入门 | ZUtil"><meta data-rh="true" name="description" content="安装"><meta data-rh="true" property="og:description" content="安装"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/introduction"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/introduction" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/introduction" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">入门</span><meta itemprop="position" content="1"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>入门</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装">安装<a href="#安装" class="hash-link" aria-label="安装的直接链接" title="安装的直接链接"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="maven">Maven<a href="#maven" class="hash-link" aria-label="Maven的直接链接" title="Maven的直接链接"></a></h3><div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">top.csaf</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">ZUtil</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">1.12.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="gradle">Gradle<a href="#gradle" class="hash-link" aria-label="Gradle的直接链接" title="Gradle的直接链接"></a></h3><div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// groovy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">implementation &#x27;top.csaf:ZUtil:1.12.0&#x27;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// kotlin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">implementation(&quot;top.csaf:ZUtil:1.12.0&quot;)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装注意">安装注意<a href="#安装注意" class="hash-link" aria-label="安装注意的直接链接" title="安装注意的直接链接"></a></h2><p>工具包中已使用 slf4j-api 和 slf4j-simple,和 spring-boot-starter-web 同时使用时会冲突,需要手动排除。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="maven-1">Maven<a href="#maven-1" class="hash-link" aria-label="Maven的直接链接" title="Maven的直接链接"></a></h3><div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 方式一:ZUtil 排除 slf4j --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">top.csaf</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">ZUtil</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">1.12.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">exclusions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">exclusion</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.slf4j</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">slf4j-api</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">exclusion</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">exclusion</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.slf4j</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">slf4j-simple</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">exclusion</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">exclusions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 方式二:spring-boot-starter-web 排除 Logback --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.springframework.boot</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">spring-boot-starter-web</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">exclusions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">exclusion</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.springframework.boot</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">spring-boot-starter-logging</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">exclusion</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">exclusions</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="gradle-1">Gradle<a href="#gradle-1" class="hash-link" aria-label="Gradle的直接链接" title="Gradle的直接链接"></a></h3><p>参考:<a href="https://docs.gradle.org/current/userguide/dependency_downgrade_and_exclude.html#sec:excluding-transitive-deps" target="_blank" rel="noopener noreferrer">Excluding transitive dependencies - Gradle User Manual</a></p><div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// groovy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> // 方式一:ZUtil 排除 slf4j</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> implementation(&#x27;top.csaf:ZUtil:1.12.0&#x27;) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exclude group: &#x27;org.slf4j&#x27;, module: &#x27;slf4j-api&#x27;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exclude group: &#x27;org.slf4j&#x27;, module: &#x27;slf4j-simple&#x27;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> // 方式二:spring-boot-starter-web 排除 Logback</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> implementation(&#x27;org.springframework.boot:spring-boot-starter-web&#x27;) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exclude group: &#x27;org.springframework.boot&#x27;, module: &#x27;spring-boot-starter-logging&#x27;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// kotlin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> // 方式一:ZUtil 排除 slf4j</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> implementation(&quot;top.csaf:ZUtil:1.12.0&quot;) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exclude(group = &quot;org.slf4j&quot;, module = &quot;slf4j-api&quot;)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exclude(group = &quot;org.slf4j&quot;, module = &quot;slf4j-simple&quot;)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> // 方式二:spring-boot-starter-web 排除 Logback</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> implementation(&quot;org.springframework.boot:spring-boot-starter-web&quot;) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exclude(group = &quot;org.springframework.boot&quot;, module = &quot;spring-boot-starter-logging&quot;)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="资源">资源<a href="#资源" class="hash-link" aria-label="资源的直接链接" title="资源的直接链接"></a></h2><ul><li><a href="https://search.maven.org/artifact/top.csaf/ZUtil" target="_blank" rel="noopener noreferrer">Maven 中央库</a></li><li><a href="https://mvnrepository.com/artifact/top.csaf/ZUtil" target="_blank" rel="noopener noreferrer">Maven Repository</a></li></ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/002-introduction.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/intro"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">介绍</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/category/参考手册"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">参考手册</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#安装" class="table-of-contents__link toc-highlight">安装</a><ul><li><a href="#maven" class="table-of-contents__link toc-highlight">Maven</a></li><li><a href="#gradle" class="table-of-contents__link toc-highlight">Gradle</a></li></ul></li><li><a href="#安装注意" class="table-of-contents__link toc-highlight">安装注意</a><ul><li><a href="#maven-1" class="table-of-contents__link toc-highlight">Maven</a></li><li><a href="#gradle-1" class="table-of-contents__link toc-highlight">Gradle</a></li></ul></li><li><a href="#资源" class="table-of-contents__link toc-highlight">资源</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-reference-doc/date/constant">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">constant 常量 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/reference-doc/date/constant"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="constant 常量 | ZUtil"><meta data-rh="true" name="description" content="DateConstant - 时间常量"><meta data-rh="true" property="og:description" content="DateConstant - 时间常量"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/constant"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/constant" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/constant" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/ZUtil/docs/reference-doc/date/constant">constant 常量</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateUtils">DateUtils 时间工具类</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateFeature">DateFeature 时间特性</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/参考手册"><span itemprop="name">参考手册</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/date-时间"><span itemprop="name">date 时间</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">constant 常量</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>constant 常量</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="dateconstant---时间常量">DateConstant - 时间常量<a href="#dateconstant---时间常量" class="hash-link" aria-label="DateConstant - 时间常量的直接链接" title="DateConstant - 时间常量的直接链接"></a></h2><p>时间工具类默认值。</p><p>如需修改,见 <a href="/ZUtil/docs/reference-doc/date/dateFeature">DateFeature</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="dateduration---持续时间">DateDuration - 持续时间<a href="#dateduration---持续时间" class="hash-link" aria-label="DateDuration - 持续时间的直接链接" title="DateDuration - 持续时间的直接链接"></a></h2><p>星期、天、小时、分钟、秒的毫秒数,还有 1000 毫秒本身。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="其他">其他<a href="#其他" class="hash-link" aria-label="其他的直接链接" title="其他的直接链接"></a></h2><ul><li><strong>DateFormat</strong> - FastDateFormat 对象</li><li><strong>DateFormatter</strong> - DateTimeFormatter 对象</li><li><strong>DatePattern</strong> - 时间格式</li><li><strong>DateRegexPattern</strong> - 时间格式正则</li></ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/date/001-constant.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/category/date-时间"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">date 时间</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/reference-doc/date/dateUtils"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">DateUtils 时间工具类</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#dateconstant---时间常量" class="table-of-contents__link toc-highlight">DateConstant - 时间常量</a></li><li><a href="#dateduration---持续时间" class="table-of-contents__link toc-highlight">DateDuration - 持续时间</a></li><li><a href="#其他" class="table-of-contents__link toc-highlight">其他</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-reference-doc/date/dateFeature">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">DateFeature 时间特性 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateFeature"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="DateFeature 时间特性 | ZUtil"><meta data-rh="true" name="description" content="可以通过临时或总是(Always)修改其静态成员变量,来决定 DateUtils 中方法对时间的处理方式。"><meta data-rh="true" property="og:description" content="可以通过临时或总是(Always)修改其静态成员变量,来决定 DateUtils 中方法对时间的处理方式。"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateFeature"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateFeature" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateFeature" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/constant">constant 常量</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateUtils">DateUtils 时间工具类</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateFeature">DateFeature 时间特性</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/参考手册"><span itemprop="name">参考手册</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/date-时间"><span itemprop="name">date 时间</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">DateFeature 时间特性</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>DateFeature 时间特性</h1><p>可以通过临时或总是(Always)修改其静态成员变量,来决定 DateUtils 中方法对时间的处理方式。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resolver_style---解析器模式风格">RESOLVER_STYLE - 解析器模式/风格<a href="#resolver_style---解析器模式风格" class="hash-link" aria-label="RESOLVER_STYLE - 解析器模式/风格的直接链接" title="RESOLVER_STYLE - 解析器模式/风格的直接链接"></a></h2><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// 临时设置解析器模式为宽容</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateFeature.set(ResolverStyle.LENIENT);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 默认为严格模式,此方法超出时间范围会报错,每个月最多 6 周,此处却需要获取第 7 周的周一</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 但如果在调用方法前将模式修改为宽容,则不会报错,正常返回,如果修改为智能,结果超出本月时会返回本月的最后一天</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateUtils.getStartDayOfWeekOfMonth(LocalDate.now(), 7);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="locale---区域">LOCALE - 区域<a href="#locale---区域" class="hash-link" aria-label="LOCALE - 区域的直接链接" title="LOCALE - 区域的直接链接"></a></h2><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// 总是设置解析器模式为中文 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateFeature.setAlways(Locale.SIMPLIFIED_CHINESE);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出周时结果为中文</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateUtils.format(LocalDate.now(), &quot;E&quot;)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出月时结果仍为中文</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateUtils.format(LocalDate.now(), &quot;MMM&quot;)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="zone_id---时区区域-id">ZONE_ID - 时区/区域 ID<a href="#zone_id---时区区域-id" class="hash-link" aria-label="ZONE_ID - 时区/区域 ID的直接链接" title="ZONE_ID - 时区/区域 ID的直接链接"></a></h2><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// 临时设置时区</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateFeature.set(ZoneId.from(ZoneOffset.UTC));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 假设系统时区为 UTC+8,因为上一行设置了时区,所以实际结果会比系统时间少 8 小时</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateUtils.format(LocalDateTime.now());</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="min_date_year---最小-date-年">MIN_DATE_YEAR - 最小 Date 年<a href="#min_date_year---最小-date-年" class="hash-link" aria-label="MIN_DATE_YEAR - 最小 Date 年的直接链接" title="MIN_DATE_YEAR - 最小 Date 年的直接链接"></a></h2><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// 临时设置最小 Date 年</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateFeature.setMinDateYear(1L);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Date 的年份为 1,而不是默认的 1970</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateUtils.toDate(LocalTime.now());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/date/003-dateFeature.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/reference-doc/date/dateUtils"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">DateUtils 时间工具类</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/category/pinyin-拼音"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">pinyin 拼音</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#resolver_style---解析器模式风格" class="table-of-contents__link toc-highlight">RESOLVER_STYLE - 解析器模式/风格</a></li><li><a href="#locale---区域" class="table-of-contents__link toc-highlight">LOCALE - 区域</a></li><li><a href="#zone_id---时区区域-id" class="table-of-contents__link toc-highlight">ZONE_ID - 时区/区域 ID</a></li><li><a href="#min_date_year---最小-date-年" class="table-of-contents__link toc-highlight">MIN_DATE_YEAR - 最小 Date 年</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-reference-doc/date/dateUtils">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">DateUtils 时间工具类 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateUtils"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="DateUtils 时间工具类 | ZUtil"><meta data-rh="true" name="description" content="继承org.apache.commons.lang3.time.DateUtils。"><meta data-rh="true" property="og:description" content="继承org.apache.commons.lang3.time.DateUtils。"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateUtils"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateUtils" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateUtils" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/constant">constant 常量</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateUtils">DateUtils 时间工具类</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/ZUtil/docs/reference-doc/date/dateFeature">DateFeature 时间特性</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/参考手册"><span itemprop="name">参考手册</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/date-时间"><span itemprop="name">date 时间</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">DateUtils 时间工具类</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>DateUtils 时间工具类</h1><p>继承<code>org.apache.commons.lang3.time.DateUtils</code></p><p>大量使用 Java 8 时间类型,即<code>LocalDate</code><code>LocalTime</code><code>LocalDateTime</code><code>ZonedDateTime</code>等。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="getformatterbuilder">getFormatterBuilder<a href="#getformatterbuilder" class="hash-link" aria-label="getFormatterBuilder的直接链接" title="getFormatterBuilder的直接链接"></a></h2><p>获取时间格式化构造器,即 <code>DateTimeFormatterBuilder</code></p><p>可以指定格式和时间级别的默认值。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// 不包含年时获取年会报错:Unsupported field: Year,但是赋值了默认时间级别后就不会</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Map&lt;TemporalField, Long&gt; fieldValueMap = new HashMap&lt;&gt;();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fieldValueMap.put(ChronoField.YEAR, 0L);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DateTimeFormatterBuilder formatterBuilder = DateUtils.getFormatterBuilder(&quot;MM-dd&quot;, fieldValueMap);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="getstartdayofweekofmonth">getStartDayOfWeekOfMonth<a href="#getstartdayofweekofmonth" class="hash-link" aria-label="getStartDayOfWeekOfMonth的直接链接" title="getStartDayOfWeekOfMonth的直接链接"></a></h2><p><img loading="lazy" src="/ZUtil/assets/images/DateUtils.getStartDayOfWeekOfMonth-42e1d575f87a192ad64fa9e8461bf8e3.png" width="673" height="1044" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="getenddayofweekofmonth">getEndDayOfWeekOfMonth<a href="#getenddayofweekofmonth" class="hash-link" aria-label="getEndDayOfWeekOfMonth的直接链接" title="getEndDayOfWeekOfMonth的直接链接"></a></h2><p><img loading="lazy" src="/ZUtil/assets/images/DateUtils.getEndDayOfWeekOfMonth-0cdedb61c94ad99ffb7dc96ff5bf8065.png" width="673" height="1045" class="img_ev3q"></p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/date/002-dateUtils.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/reference-doc/date/constant"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">constant 常量</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/reference-doc/date/dateFeature"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">DateFeature 时间特性</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#getformatterbuilder" class="table-of-contents__link toc-highlight">getFormatterBuilder</a></li><li><a href="#getstartdayofweekofmonth" class="table-of-contents__link toc-highlight">getStartDayOfWeekOfMonth</a></li><li><a href="#getenddayofweekofmonth" class="table-of-contents__link toc-highlight">getEndDayOfWeekOfMonth</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-reference-doc/pinyin/pinyinFeature">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">PinyinFeature 拼音特性 | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/docs/reference-doc/pinyin/pinyinFeature"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="PinyinFeature 拼音特性 | ZUtil"><meta data-rh="true" name="description" content="可以通过临时或总是(Always)修改其静态成员变量,来决定 PinyinUtils 中方法对拼音的处理方式。"><meta data-rh="true" property="og:description" content="可以通过临时或总是(Always)修改其静态成员变量,来决定 PinyinUtils 中方法对拼音的处理方式。"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/docs/reference-doc/pinyin/pinyinFeature"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/pinyin/pinyinFeature" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/docs/reference-doc/pinyin/pinyinFeature" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="文档侧边栏" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/intro">介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/introduction">入门</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/ZUtil/docs/category/参考手册">参考手册</a><button aria-label="打开/收起侧边栏菜单「参考手册」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="/ZUtil/docs/category/date-时间">date 时间</a><button aria-label="打开/收起侧边栏菜单「date 时间」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="/ZUtil/docs/category/pinyin-拼音">pinyin 拼音</a><button aria-label="打开/收起侧边栏菜单「pinyin 拼音」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/ZUtil/docs/reference-doc/pinyin/pinyinFeature">PinyinFeature 拼音特性</a></li></ul></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/ZUtil/docs/incompatible-changes">不兼容变更</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/ZUtil/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/参考手册"><span itemprop="name">参考手册</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/ZUtil/docs/category/pinyin-拼音"><span itemprop="name">pinyin 拼音</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">PinyinFeature 拼音特性</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>PinyinFeature 拼音特性</h1><p>可以通过临时或总是(Always)修改其静态成员变量,来决定 PinyinUtils 中方法对拼音的处理方式。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="first_word_initial_cap---第一个单词首字母是否大写">FIRST_WORD_INITIAL_CAP - 第一个单词首字母是否大写<a href="#first_word_initial_cap---第一个单词首字母是否大写" class="hash-link" aria-label="FIRST_WORD_INITIAL_CAP - 第一个单词首字母是否大写的直接链接" title="FIRST_WORD_INITIAL_CAP - 第一个单词首字母是否大写的直接链接"></a></h2><p>第一个汉字的拼音首字母是否大写,默认为 false。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="second_word_initial_cap---第二个单词首字母是否大写">SECOND_WORD_INITIAL_CAP - 第二个单词首字母是否大写<a href="#second_word_initial_cap---第二个单词首字母是否大写" class="hash-link" aria-label="SECOND_WORD_INITIAL_CAP - 第二个单词首字母是否大写的直接链接" title="SECOND_WORD_INITIAL_CAP - 第二个单词首字母是否大写的直接链接"></a></h2><p>后续汉字的拼音首字母是否大写,默认为 false。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="has_separator_by_not_pinyin_around---非拼音前后是否需要分隔符">HAS_SEPARATOR_BY_NOT_PINYIN_AROUND - 非拼音前后是否需要分隔符<a href="#has_separator_by_not_pinyin_around---非拼音前后是否需要分隔符" class="hash-link" aria-label="HAS_SEPARATOR_BY_NOT_PINYIN_AROUND - 非拼音前后是否需要分隔符的直接链接" title="HAS_SEPARATOR_BY_NOT_PINYIN_AROUND - 非拼音前后是否需要分隔符的直接链接"></a></h2><p>如果遇到非汉字,传参了分隔符时,非汉字的两侧是否需要此分隔符,默认为 false。</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为 hǎo hǎo xué xí,tiān tiān xiàng shàng,可以看到“,”的两边没有空格</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(PinyinUtils.get(&quot;好好学习,天天向上&quot;, true, true, &quot; &quot;));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 临时设置非拼音前后需要分隔符</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PinyinFeature.setHasSeparatorByNotPinyinAround(true);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// 输出结果为 hǎo hǎo xué xí , tiān tiān xiàng shàng</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">System.out.println(PinyinUtils.get(&quot;好好学习,天天向上&quot;, true, true, &quot; &quot;));</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/duanluan/ZUtil/tree/main/docs/docs/003-reference-doc/pinyin/001-pinyinFeature.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>编辑此页</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/ZUtil/docs/category/pinyin-拼音"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">pinyin 拼音</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/ZUtil/docs/incompatible-changes"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">不兼容变更</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#first_word_initial_cap---第一个单词首字母是否大写" class="table-of-contents__link toc-highlight">FIRST_WORD_INITIAL_CAP - 第一个单词首字母是否大写</a></li><li><a href="#second_word_initial_cap---第二个单词首字母是否大写" class="table-of-contents__link toc-highlight">SECOND_WORD_INITIAL_CAP - 第二个单词首字母是否大写</a></li><li><a href="#has_separator_by_not_pinyin_around---非拼音前后是否需要分隔符" class="table-of-contents__link toc-highlight">HAS_SEPARATOR_BY_NOT_PINYIN_AROUND - 非拼音前后是否需要分隔符</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
文件已添加
<?xml version="1.0" encoding="UTF-8"?><svg id="_层_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 845.17 715.72"><defs><style>.cls-1{fill:#ffdc00;}.cls-1,.cls-2,.cls-3{stroke:#231815;stroke-miterlimit:10;stroke-width:20.54px;}.cls-2{fill:#e0e0e0;}.cls-3{fill:#d64816;}</style></defs><path id="_利刀" class="cls-2" d="M260.33,674.71c-.58,.02-1.17,.05-1.75,.07l-.43-85.61c-.11-22.38-.2-45.01,4.86-66.81,13.56,.14,27.18,1.21,40.71,1.21,12.02,0,24.05,0,36.07,0h220.36c36.99,0,73.69-1.02,110.35,3.32,59.19,7.01,115.64,35.21,156.8,78.31-18.92,7.65-37.86,15.27-56.88,22.66-64.9,25.2-130.35,36.74-199.93,40.4-93.38,4.91-186.17,1.91-279.75,5.26-10.14,.36-20.27,.76-30.4,1.18Z"/><path id="_齿刀" class="cls-2" d="M361.08,62.3c-62.81-1.83-125.65-2.6-188.12,4.88-54.63,6.55-101.76,23.24-146.18,56.55-5.76,4.32-18.1,12.73-16.34,21.47,1.76,8.7,17.69,12.19,24.95,14.88,27.13,10.07,53.62,21.89,79.24,35.36,11.56,6.08,19.15,14.05,28.09,22.46,12.4-10.03,23.72-22.25,35.28-33.31l34.33,34.33,35.43-35.43,41.06,41.06,40.02-40.02,42.24,42.24,34.39-34.39,37.57,37.57c41.28-1.03,82.93-3.51,124.12-2.99,.34-48.43,.26-96.88,.03-145.32-.06-12.26,2.06-15.24-8.74-18.32-9.73-2.77-26.1,1.27-36.38,1.52-23.34,.58-46.69,.45-70.03,.02-30.28-.56-60.61-1.69-90.96-2.57Z"/><g id="_柄"><rect id="_体" class="cls-3" x="-8.09" y="221.99" width="867.23" height="271.75" rx="133.02" ry="133.02" transform="translate(979.46 310.02) rotate(135)"/><circle id="_饰" class="cls-1" cx="633.74" cy="149.64" r="29.12"/><circle id="_饰-2" class="cls-1" cx="214.88" cy="568.5" r="30.07"/></g></svg>
\ No newline at end of file
文件已添加
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="plugin-pages plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">Hello from ZUtil | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Hello from ZUtil | ZUtil"><meta data-rh="true" name="description" content="Description will go into a meta tag in &lt;head /&gt;"><meta data-rh="true" property="og:description" content="Description will go into a meta tag in &lt;head /&gt;"><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/" hreflang="x-default"><script data-rh="true">function maybeInsertBanner(){window.__DOCUSAURUS_INSERT_BASEURL_BANNER&&insertBanner()}function insertBanner(){var n=document.getElementById("docusaurus-base-url-issue-banner-container");if(n){n.innerHTML='\n<div id="docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">/ZUtil/</span> </p>\n <p>We suggest trying baseUrl = <span id="docusaurus-base-url-issue-banner-suggestion-container" style="font-weight: bold; color: green;"></span></p>\n</div>\n';var e=document.getElementById("docusaurus-base-url-issue-banner-suggestion-container"),s=window.location.pathname,r="/"===s.substr(-1)?s:s+"/";e.innerHTML=r}}window.__DOCUSAURUS_INSERT_BASEURL_BANNER=!0,document.addEventListener("DOMContentLoaded",maybeInsertBanner)</script><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div id="docusaurus-base-url-issue-banner-container"></div><div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><header class="hero hero--primary heroBanner_qdFl"><div class="container"><h1 class="hero__title">ZUtil</h1><p class="hero__subtitle">追求更快更全的 Java 工具类</p><div class="buttons_AeoN"><a class="button button--secondary button--lg" href="/ZUtil/docs/introduction">ZUtil 教程 - 5min ⏱️</a></div></div></header><main><section class="features_t9lD"><div class="container"><div class="row"><div class="col col--4"><div class="text--center padding-horiz--md"><h3>更快</h3><p>使用 JMH 进行性能测试。<br><a href="https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/jmh" target="_blank">https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/jmh</a></p></div></div><div class="col col--4"><div class="text--center padding-horiz--md"><h3>更全</h3><p><a href="https://github.com/duanluan/ZUtil/blob/main/src/main/java/top/csaf/date/DateUtils.java" target="_blank">时间工具类</a>近 120 个方法,2500+ 行;<br><a href="https://github.com/duanluan/ZUtil/blob/main/src/main/java/top/csaf/regex/RegExUtils.java" target="_blank">正则工具类</a>近 50 个方法,750+ 行。<br>其他工具类也在持续更新中……</p></div></div><div class="col col--4"><div class="text--center padding-horiz--md"><h3>更安全</h3><p>使用 <a href="https://junit.org/junit5/" target="_blank">JUnit</a> 进行套件测试,<a href="https://www.jacoco.org/jacoco/index.html" target="_blank">JaCoCo</a> 进行代码覆盖率测试,保证每行代码都符合预期,更少出 BUG。<br><a href="https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/junit" target="_blank">https://github.com/duanluan/ZUtil/tree/main/src/test/java/top/csaf/junit</a></p></div></div></div></div></section></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="zh-Hans" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">Markdown page example | ZUtil</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://duanluan.github.io/ZUtil/markdown-page"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Markdown page example | ZUtil"><meta data-rh="true" name="description" content="You don&#x27;t need React to write simple standalone pages."><meta data-rh="true" property="og:description" content="You don&#x27;t need React to write simple standalone pages."><link data-rh="true" rel="icon" href="/ZUtil/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://duanluan.github.io/ZUtil/markdown-page"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/markdown-page" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://duanluan.github.io/ZUtil/markdown-page" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/ZUtil/blog/rss.xml" title="ZUtil RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/ZUtil/blog/atom.xml" title="ZUtil Atom Feed"><link rel="stylesheet" href="/ZUtil/assets/css/styles.6d2802de.css">
<link rel="preload" href="/ZUtil/assets/js/runtime~main.92dce17c.js" as="script">
<link rel="preload" href="/ZUtil/assets/js/main.385e0aa3.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="跳到主要内容"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">跳到主要内容</a></div><nav aria-label="主导航" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="切换导航栏" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/ZUtil/"><div class="navbar__logo"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/ZUtil/img/logo.svg" alt="My Site Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">ZUtil</b></a><a class="navbar__item navbar__link" href="/ZUtil/docs/intro">教程</a><a class="navbar__item navbar__link" href="/ZUtil/blog">博客</a></div><div class="navbar__items navbar__items--right"><div class="navbar__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="切换浅色/暗黑模式(当前为浅色模式)" aria-label="切换浅色/暗黑模式(当前为浅色模式)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><main class="container container--fluid margin-vert--lg"><div class="row mdxPageWrapper_j9I6"><div class="col col--8"><article><h1>Markdown page example</h1><p>You don&#x27;t need React to write simple standalone pages.</p></article></div></div></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/docs/intro">教程</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jq.qq.com/?_wv=1027&amp;k=Jzpzg0lc" target="_blank" rel="noopener noreferrer" class="footer__link-item">QQ 群<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil/discussions" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Discussions<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://segmentfault.com/search?q=zutil&amp;type=qa" target="_blank" rel="noopener noreferrer" class="footer__link-item">SegmentFault 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/search?scope=bbs&amp;q=zutil" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://so.csdn.net/so/search?q=zutil&amp;t=ask" target="_blank" rel="noopener noreferrer" class="footer__link-item">CSDN 问答<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/ZUtil/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/duanluan/ZUtil" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 ZUtil, Inc. Built with duanluan.</div></div></div></footer></div>
<script src="/ZUtil/assets/js/runtime~main.92dce17c.js"></script>
<script src="/ZUtil/assets/js/main.385e0aa3.js"></script>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://duanluan.github.io/ZUtil/blog</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/archive</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/javaTimeZone</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/tags</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/tags/%E6%97%B6%E9%97%B4</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/tags/%E6%97%B6%E5%8C%BA</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/tags/hello</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/tags/time</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/tags/zone</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/blog/welcome</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/markdown-page</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/category/%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/category/date-%E6%97%B6%E9%97%B4</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/category/pinyin-%E6%8B%BC%E9%9F%B3</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/incompatible-changes</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/intro</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/introduction</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/reference-doc/date/constant</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateFeature</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/reference-doc/date/dateUtils</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/docs/reference-doc/pinyin/pinyinFeature</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://duanluan.github.io/ZUtil/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url></urlset>
\ No newline at end of file