{"id":739,"date":"2026-03-17T15:52:29","date_gmt":"2026-03-17T15:52:29","guid":{"rendered":"https:\/\/primetoolhub.com\/?page_id=739"},"modified":"2026-07-15T17:21:17","modified_gmt":"2026-07-15T17:21:17","slug":"cron-job-generator","status":"publish","type":"page","link":"https:\/\/schoolict.net\/tools\/cron-job-generator\/","title":{"rendered":"Cron Job Generator &amp; Parser"},"content":{"rendered":"\n<div class=\"pth-hero-section\">\n    <div class=\"pth-hero-content\">\n        <h2>Cron Studio Pro<\/h2>\n        <p>Generate, parse, and test Cron job expressions offline. Instantly translate complex crontab schedules into human-readable text and view upcoming execution dates. now use Cron Job Generator &amp; Parser.<\/p>\n\n        <div id=\"pth-toc-placeholder\"><\/div>\n    <\/div>\n\n<div class=\"pth-hero-image\">\n    <img data-no-lazy=\"1\"\n         src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/07\/Cron-Job-Generator-pro-Tool-800x447.jpeg\"\n         width=\"800\"\n         height=\"447\"\n         alt=\"Cron Studio Pro\"\n         fetchpriority=\"high\"\n         loading=\"eager\"\n         decoding=\"async\"\n         style=\"width:100%; height:auto; display:block;\">\n  <\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ul><li><a href=\"#\ud83d\udd34-what-a-cron-expression-actually-does-and-why-getting-it-wrong-is-costly\">\ud83d\udd34 What a Cron Expression Actually Does \u2014 and Why Getting It Wrong Is Costly<\/a><\/li><li><a href=\"#\ud83d\udfe1-the-five-fields-what-each-position-controls\">\ud83d\udfe1 The Five Fields \u2014 What Each Position Controls<\/a><ul><li><a href=\"#\ud83d\udfe2-day-of-month-vs-day-of-week-the-or-logic-trap\">\ud83d\udfe2 Day of Month vs Day of Week \u2014 The OR Logic Trap<\/a><\/li><\/ul><\/li><li><a href=\"#\ud83d\udd34-30-real-world-cron-patterns-and-when-to-use-each\">\ud83d\udd34 30 Real-World Cron Patterns and When to Use Each<\/a><ul><li><a href=\"#\ud83d\udfe2-backup-schedules-stagger-to-avoid-peak-load\">\ud83d\udfe2 Backup Schedules \u2014 Stagger to Avoid Peak Load<\/a><\/li><li><a href=\"#\ud83d\udfe2-web-maintenance-cache-sitemaps-and-ssl\">\ud83d\udfe2 Web Maintenance \u2014 Cache, Sitemaps and SSL<\/a><\/li><li><a href=\"#\ud83d\udfe2-reporting-jobs-timing-around-business-hours\">\ud83d\udfe2 Reporting Jobs \u2014 Timing Around Business Hours<\/a><\/li><\/ul><\/li><li><a href=\"#\ud83d\udfe1-platform-differences-why-the-same-expression-fails-on-aws-but-works-on-linux\">\ud83d\udfe1 Platform Differences \u2014 Why the Same Expression Fails on AWS but Works on Linux<\/a><\/li><\/ul><\/nav><\/div>\n\n\n<style>\r\n\/* ==========================================================================\r\n   PTH CRON STUDIO PRO v3.0\r\n   WCAG 2.1 AA | AdSense Safe | PageSpeed 100 | WP\/LiteSpeed Safe\r\n   ========================================================================== *\/\r\n#pth-cron-wrap{font-family:'Inter',system-ui,-apple-system,sans-serif;width:100%;max-width:1400px;margin:0 auto;box-sizing:border-box;color:#1e293b;font-weight:500;background:#f8fafc;padding:20px;border-radius:16px;}\r\n#pth-cron-wrap *{box-sizing:border-box;min-width:0;}\r\n#pth-cron-wrap h2,#pth-cron-wrap h3,#pth-cron-wrap h4{color:#0f172a;font-weight:800;margin-top:0;}\r\n\/* Layout *\/\r\n#pth-cron-wrap .cs-outer{display:grid;grid-template-columns:1fr 300px;gap:20px;align-items:start;}\r\n#pth-cron-wrap .cs-outer.cs-full{grid-template-columns:100%;}\r\n#pth-cron-wrap .cs-outer.cs-full .cs-sidebar{display:none;}\r\n\/* Card *\/\r\n#pth-cron-wrap .cs-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;margin-bottom:16px;box-shadow:0 2px 8px rgba(0,0,0,0.04);}\r\n\/* Header *\/\r\n#pth-cron-wrap .cs-title{font-size:22px;font-weight:800;color:#1d4ed8;margin:0;display:flex;align-items:center;gap:8px;}\r\n#pth-cron-wrap .cs-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:13px;}\r\n#pth-cron-wrap .cs-badge{font-size:11px;font-weight:700;padding:2px 8px;border-radius:4px;}\r\n#pth-cron-wrap .cb-blue{background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;}\r\n#pth-cron-wrap .cb-green{background:#f0fdf4;color:#15803d;border:1px solid #bbf7d0;}\r\n\/* Tabs *\/\r\n#pth-cron-wrap .cs-tabs{display:flex;gap:3px;background:#e2e8f0;padding:4px;border-radius:10px;margin-bottom:18px;flex-wrap:wrap;}\r\n#pth-cron-wrap .cs-tab{flex:1;min-width:110px;padding:9px 6px;border:none;background:transparent;color:#334155;font-weight:700;font-size:12px;border-radius:7px;cursor:pointer;transition:all 0.18s;font-family:'Inter',sans-serif;white-space:nowrap;}\r\n#pth-cron-wrap .cs-tab.on{background:#fff;color:#1d4ed8;box-shadow:0 2px 6px rgba(0,0,0,0.1);}\r\n#pth-cron-wrap .cs-tab:hover:not(.on){background:#f1f5f9;}\r\n#pth-cron-wrap .cs-panel{display:none;}\r\n#pth-cron-wrap .cs-panel.on{display:block;}\r\n\/* Buttons *\/\r\n#pth-cron-wrap .cs-btn{padding:9px 16px;border-radius:8px;font-weight:700;cursor:pointer;border:none;font-family:'Inter',sans-serif;font-size:13px;display:inline-flex;align-items:center;justify-content:center;gap:5px;transition:background 0.18s,transform 0.12s;}\r\n#pth-cron-wrap .cs-btn:hover{transform:translateY(-1px);}\r\n#pth-cron-wrap .bn-blue{background:#2563eb;color:#fff;}\r\n#pth-cron-wrap .bn-blue:hover{background:#1d4ed8;}\r\n#pth-cron-wrap .bn-grey{background:#f1f5f9;color:#0f172a;border:1px solid #e2e8f0;}\r\n#pth-cron-wrap .bn-grey:hover{background:#e2e8f0;}\r\n#pth-cron-wrap .bn-green{background:#f0fdf4;color:#047857;border:1px solid #bbf7d0;}\r\n#pth-cron-wrap .bn-green:hover{background:#dcfce7;}\r\n#pth-cron-wrap .bn-red{background:#fef2f2;color:#991b1b;border:1px solid #fecaca;}\r\n#pth-cron-wrap .cs-smpl{background:#d1fae5;color:#047857;border:1px solid #6ee7b7;font-size:12px;padding:5px 12px;border-radius:6px;font-weight:700;cursor:pointer;display:inline-flex;align-items:center;gap:4px;}\r\n\/* Section heading *\/\r\n#pth-cron-wrap .cs-sh{font-size:11px;font-weight:800;color:#2563eb;text-transform:uppercase;letter-spacing:0.6px;margin:14px 0 8px;padding-bottom:5px;border-bottom:2px solid #eff6ff;}\r\n\/* Form *\/\r\n#pth-cron-wrap label{font-weight:700;color:#0f172a;margin-bottom:4px;display:block;font-size:11px;text-transform:uppercase;letter-spacing:0.4px;}\r\n#pth-cron-wrap input[type=\"text\"],#pth-cron-wrap input[type=\"number\"],#pth-cron-wrap select,#pth-cron-wrap textarea{width:100%;padding:8px 10px;border:2px solid #e2e8f0;border-radius:7px;font-family:'Inter',sans-serif;color:#0f172a;background:#fff;font-size:0.84rem;transition:border-color 0.18s;}\r\n#pth-cron-wrap input:focus,#pth-cron-wrap select:focus{border-color:#2563eb;outline:none;box-shadow:0 0 0 3px rgba(37,99,235,0.1);}\r\n#pth-cron-wrap input[type=\"range\"]{accent-color:#2563eb;width:100%;}\r\n#pth-cron-wrap input[type=\"checkbox\"]{accent-color:#2563eb;width:14px;height:14px;cursor:pointer;}\r\n#pth-cron-wrap .cs-g2{display:grid;grid-template-columns:1fr 1fr;gap:10px;}\r\n#pth-cron-wrap .cs-g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:9px;}\r\n#pth-cron-wrap .cs-fld{display:flex;flex-direction:column;gap:4px;margin-bottom:9px;}\r\n\/* Main cron input *\/\r\n#pth-cron-wrap .cs-cron-input-wrap{display:flex;gap:10px;margin-bottom:12px;align-items:center;}\r\n#pth-cron-wrap .cs-cron-input{flex:1;padding:14px 18px;font-size:1.6rem;font-family:'Courier New',monospace;font-weight:700;color:#0f172a;background:#f8fafc;border:2px solid #e2e8f0;border-radius:10px;text-align:center;letter-spacing:3px;transition:border-color 0.2s;}\r\n#pth-cron-wrap .cs-cron-input:focus{border-color:#2563eb;outline:none;box-shadow:0 0 0 3px rgba(37,99,235,0.1);background:#fff;}\r\n#pth-cron-wrap .cs-cron-input.valid{border-color:#059669;}\r\n#pth-cron-wrap .cs-cron-input.invalid{border-color:#dc2626;}\r\n\/* Human readable *\/\r\n#pth-cron-wrap .cs-human{background:#f0fdf4;border:1px solid #6ee7b7;color:#047857;padding:14px 18px;border-radius:10px;font-size:1rem;font-weight:700;text-align:center;min-height:52px;display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:14px;line-height:1.4;}\r\n#pth-cron-wrap .cs-human.err{background:#fef2f2;border-color:#fca5a5;color:#991b1b;}\r\n#pth-cron-wrap .cs-human.warn{background:#fffbeb;border-color:#fcd34d;color:#92400e;}\r\n\/* Segments *\/\r\n#pth-cron-wrap .cs-segs{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-bottom:16px;}\r\n#pth-cron-wrap .cs-seg{background:#f8fafc;border:2px solid #e2e8f0;border-radius:10px;padding:12px 4px;text-align:center;cursor:pointer;transition:all 0.18s;}\r\n#pth-cron-wrap .cs-seg:hover{border-color:#2563eb;background:#eff6ff;}\r\n#pth-cron-wrap .cs-seg.active{border-color:#2563eb;background:#dbeafe;}\r\n#pth-cron-wrap .cs-seg-val{font-size:1.3rem;font-weight:800;font-family:monospace;color:#0f172a;margin-bottom:3px;}\r\n#pth-cron-wrap .cs-seg-lbl{font-size:10px;color:#334155;font-weight:700;text-transform:uppercase;letter-spacing:0.4px;}\r\n#pth-cron-wrap .cs-seg-hint{font-size:9px;color:#2563eb;font-weight:600;margin-top:2px;}\r\n\/* Next runs *\/\r\n#pth-cron-wrap .cs-runs-list{list-style:none;padding:0;margin:0;}\r\n#pth-cron-wrap .cs-runs-list li{padding:9px 14px;border-bottom:1px solid #f1f5f9;font-size:0.84rem;color:#1e293b;display:flex;align-items:center;justify-content:space-between;gap:8px;}\r\n#pth-cron-wrap .cs-runs-list li:last-child{border-bottom:none;}\r\n#pth-cron-wrap .cs-run-time{font-family:monospace;font-weight:700;color:#0f172a;}\r\n#pth-cron-wrap .cs-run-rel{font-size:11px;color:#2563eb;font-weight:700;background:#eff6ff;padding:2px 7px;border-radius:10px;white-space:nowrap;}\r\n\/* Presets *\/\r\n#pth-cron-wrap .cs-preset-search{margin-bottom:12px;}\r\n#pth-cron-wrap .cs-preset-cats{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:12px;}\r\n#pth-cron-wrap .cs-cat-btn{padding:4px 10px;font-size:11px;border-radius:14px;cursor:pointer;font-weight:700;border:1px solid #e2e8f0;background:#f8fafc;color:#334155;transition:all 0.15s;font-family:'Inter',sans-serif;}\r\n#pth-cron-wrap .cs-cat-btn.on{background:#2563eb;color:#fff;border-color:#2563eb;}\r\n#pth-cron-wrap .cs-preset-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;}\r\n#pth-cron-wrap .cs-preset-card{border:1px solid #e2e8f0;border-radius:9px;padding:12px;background:#fff;cursor:pointer;transition:all 0.18s;}\r\n#pth-cron-wrap .cs-preset-card:hover{border-color:#2563eb;background:#eff6ff;transform:translateY(-1px);}\r\n#pth-cron-wrap .cs-preset-name{font-size:12px;font-weight:800;color:#0f172a;margin-bottom:3px;}\r\n#pth-cron-wrap .cs-preset-code{font-family:monospace;font-size:11px;color:#2563eb;font-weight:700;background:#eff6ff;padding:2px 6px;border-radius:4px;display:inline-block;margin-bottom:4px;}\r\n#pth-cron-wrap .cs-preset-desc{font-size:10px;color:#475569;font-weight:500;}\r\n#pth-cron-wrap .cs-preset-cat-tag{font-size:9px;font-weight:700;padding:1px 5px;border-radius:8px;margin-top:4px;display:inline-block;}\r\n\/* Visual builder *\/\r\n#pth-cron-wrap .cs-vb-mode-btns{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap;}\r\n#pth-cron-wrap .cs-vb-mode{padding:7px 14px;border-radius:7px;font-size:12px;font-weight:700;cursor:pointer;border:2px solid #e2e8f0;background:#fff;color:#334155;transition:all 0.18s;font-family:'Inter',sans-serif;}\r\n#pth-cron-wrap .cs-vb-mode.on{border-color:#2563eb;background:#2563eb;color:#fff;}\r\n#pth-cron-wrap .cs-vb-section{display:none;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;margin-bottom:14px;}\r\n#pth-cron-wrap .cs-vb-section.on{display:block;}\r\n#pth-cron-wrap .cs-dow-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin-top:8px;}\r\n#pth-cron-wrap .cs-dow-btn{padding:7px 3px;border-radius:7px;text-align:center;cursor:pointer;font-size:11px;font-weight:700;border:2px solid #e2e8f0;background:#fff;color:#334155;transition:all 0.15s;font-family:'Inter',sans-serif;}\r\n#pth-cron-wrap .cs-dow-btn.on{background:#2563eb;color:#fff;border-color:#2563eb;}\r\n#pth-cron-wrap .cs-dom-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-top:8px;}\r\n#pth-cron-wrap .cs-dom-btn{padding:6px 2px;border-radius:6px;text-align:center;cursor:pointer;font-size:11px;font-weight:700;border:1px solid #e2e8f0;background:#fff;color:#334155;transition:all 0.15s;font-family:'Inter',sans-serif;}\r\n#pth-cron-wrap .cs-dom-btn.on{background:#2563eb;color:#fff;border-color:#2563eb;}\r\n#pth-cron-wrap .cs-month-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:5px;margin-top:8px;}\r\n#pth-cron-wrap .cs-month-btn{padding:6px 3px;border-radius:6px;text-align:center;cursor:pointer;font-size:11px;font-weight:700;border:1px solid #e2e8f0;background:#fff;color:#334155;transition:all 0.15s;font-family:'Inter',sans-serif;}\r\n#pth-cron-wrap .cs-month-btn.on{background:#2563eb;color:#fff;border-color:#2563eb;}\r\n#pth-cron-wrap .cs-vb-preview{background:#1e293b;color:#38bdf8;font-family:monospace;font-size:1.2rem;font-weight:800;padding:14px;border-radius:8px;text-align:center;margin-top:12px;letter-spacing:2px;}\r\n\/* Reference tab *\/\r\n#pth-cron-wrap .cs-ref-table{width:100%;border-collapse:collapse;margin-bottom:14px;}\r\n#pth-cron-wrap .cs-ref-table th,#pth-cron-wrap .cs-ref-table td{text-align:left;padding:9px 10px;border-bottom:1px solid #e2e8f0;font-size:0.83rem;}\r\n#pth-cron-wrap .cs-ref-table th{color:#0f172a;font-weight:800;background:#f8fafc;}\r\n#pth-cron-wrap .cs-ref-table td{color:#1e293b;}\r\n#pth-cron-wrap .cs-code{background:#f1f5f9;color:#1d4ed8;padding:2px 7px;border-radius:4px;font-family:monospace;font-size:0.8rem;font-weight:700;}\r\n#pth-cron-wrap .cs-platform-card{border:1px solid #e2e8f0;border-radius:9px;padding:13px;margin-bottom:9px;background:#fff;}\r\n#pth-cron-wrap .cs-platform-name{font-size:12px;font-weight:800;color:#0f172a;margin-bottom:5px;display:flex;align-items:center;gap:6px;}\r\n#pth-cron-wrap .cs-platform-note{font-size:11px;color:#475569;line-height:1.5;}\r\n#pth-cron-wrap .cs-special-grid{display:grid;grid-template-columns:auto 1fr auto;gap:6px 12px;align-items:center;margin-bottom:14px;}\r\n#pth-cron-wrap .cs-sp-code{font-family:monospace;font-weight:700;color:#1d4ed8;background:#eff6ff;padding:3px 8px;border-radius:5px;font-size:12px;}\r\n#pth-cron-wrap .cs-sp-desc{font-size:12px;color:#1e293b;font-weight:500;}\r\n#pth-cron-wrap .cs-sp-apply{font-size:10px;color:#2563eb;cursor:pointer;font-weight:700;text-decoration:underline;white-space:nowrap;}\r\n\/* Sidebar *\/\r\n#pth-cron-wrap .cs-sidebar{position:sticky;top:16px;}\r\n#pth-cron-wrap .cs-sb-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;margin-bottom:14px;}\r\n#pth-cron-wrap .cs-sb-head{background:#f8fafc;padding:9px 13px;border-bottom:1px solid #e2e8f0;font-size:11px;font-weight:800;color:#1d4ed8;text-transform:uppercase;letter-spacing:0.5px;}\r\n#pth-cron-wrap .cs-sb-body{padding:13px;}\r\n#pth-cron-wrap .cs-tip{display:flex;gap:8px;margin-bottom:9px;align-items:flex-start;}\r\n#pth-cron-wrap .cs-tip:last-child{margin-bottom:0;}\r\n#pth-cron-wrap .cs-tip-icon{font-size:16px;flex-shrink:0;margin-top:1px;}\r\n#pth-cron-wrap .cs-tip-text{font-size:0.76rem;color:#334155;line-height:1.5;}\r\n#pth-cron-wrap .cs-tip-text strong{color:#0f172a;display:block;font-weight:700;margin-bottom:1px;}\r\n\/* Chip \/ badge *\/\r\n#pth-cron-wrap .cs-chip{display:inline-flex;align-items:center;gap:4px;background:#f1f5f9;border:1px solid #e2e8f0;color:#334155;font-size:10px;font-weight:700;padding:2px 8px;border-radius:12px;}\r\n\/* Timezone *\/\r\n#pth-cron-wrap .cs-tz-bar{display:flex;gap:8px;align-items:center;margin-bottom:12px;flex-wrap:wrap;}\r\n\/* Diff indicator *\/\r\n#pth-cron-wrap .cs-diff{font-size:12px;color:#475569;font-weight:600;text-align:center;margin-bottom:8px;}\r\n\/* Mobile *\/\r\n@media(max-width:900px){\r\n#pth-cron-wrap .cs-outer{grid-template-columns:100% !important;}\r\n#pth-cron-wrap .cs-sidebar{position:static;margin-top:14px;}\r\n#pth-cron-wrap .cs-preset-grid{grid-template-columns:1fr;}\r\n}\r\n@media(max-width:640px){\r\n#pth-cron-wrap .cs-card{padding:13px;}\r\n#pth-cron-wrap .cs-cron-input{font-size:1.1rem;letter-spacing:1px;padding:10px 8px;}\r\n#pth-cron-wrap .cs-segs{grid-template-columns:repeat(3,1fr);}\r\n#pth-cron-wrap .cs-dow-grid{grid-template-columns:repeat(4,1fr);}\r\n#pth-cron-wrap .cs-month-grid{grid-template-columns:repeat(3,1fr);}\r\n#pth-cron-wrap .cs-tab{font-size:11px;padding:7px 4px;min-width:80px;}\r\n}\r\n<\/style>\r\n\r\n<div id=\"pth-cron-toast\" role=\"status\" aria-live=\"polite\" style=\"position:fixed;bottom:24px;right:24px;z-index:9999;display:flex;flex-direction:column;gap:8px;pointer-events:none;\"><\/div>\r\n\r\n<div id=\"pth-cron-wrap\">\r\n<div class=\"cs-outer\" id=\"pth-cron-outer\">\r\n\r\n<div>\r\n<div class=\"cs-card\">\r\n\r\n<div style=\"display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:9px;flex-wrap:wrap;gap:7px;\">\r\n<h2 class=\"cs-title\">\u23f0 Cron Studio Pro<\/h2>\r\n<button type=\"button\" class=\"cs-btn bn-grey\" id=\"pth-cron-fw\" aria-label=\"Toggle full width\">\u26f6 Full Width<\/button>\r\n<\/div>\r\n<div class=\"cs-meta\">\r\n<span class=\"cs-badge cb-blue\">v3.0<\/span>\r\n<span class=\"cs-badge cb-green\">\ud83d\udd12 100% Offline<\/span>\r\n<\/div>\r\n<div style=\"display:flex;gap:7px;margin-bottom:13px;flex-wrap:wrap;align-items:center;\">\r\n<button type=\"button\" class=\"cs-smpl\" id=\"pth-cron-sample\" aria-label=\"Load sample\">\ud83d\udca1 Load Sample<\/button>\r\n<button type=\"button\" class=\"cs-btn bn-red\" id=\"pth-cron-clear\" style=\"font-size:11px;padding:4px 10px;border-radius:6px;\" aria-label=\"Clear\">\ud83d\uddd1\ufe0f Clear<\/button>\r\n<\/div>\r\n\r\n<div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:16px;margin-bottom:16px;\">\r\n<label for=\"pth-cron-input\" style=\"font-size:12px;margin-bottom:6px;\">Cron Expression<\/label>\r\n<div class=\"cs-cron-input-wrap\">\r\n<input type=\"text\" id=\"pth-cron-input\" class=\"cs-cron-input\" value=\"0 12 * * 1-5\" autocomplete=\"off\" spellcheck=\"false\" aria-label=\"Cron expression input\">\r\n<button type=\"button\" class=\"cs-btn bn-blue\" id=\"pth-cron-copy\" aria-label=\"Copy cron expression\">\ud83d\udccb Copy<\/button>\r\n<\/div>\r\n<div id=\"pth-cron-human\" class=\"cs-human\" role=\"status\" aria-live=\"polite\">Loading...<\/div>\r\n\r\n<div class=\"cs-segs\" id=\"pth-cron-segs\">\r\n<div class=\"cs-seg\" id=\"pth-seg-0\" role=\"button\" tabindex=\"0\" aria-label=\"Minute field\" title=\"Click to edit Minute\">\r\n<div class=\"cs-seg-val\" id=\"pth-sv-0\">0<\/div>\r\n<div class=\"cs-seg-lbl\">Minute<\/div>\r\n<div class=\"cs-seg-hint\">0\u201359<\/div>\r\n<\/div>\r\n<div class=\"cs-seg\" id=\"pth-seg-1\" role=\"button\" tabindex=\"0\" aria-label=\"Hour field\" title=\"Click to edit Hour\">\r\n<div class=\"cs-seg-val\" id=\"pth-sv-1\">12<\/div>\r\n<div class=\"cs-seg-lbl\">Hour<\/div>\r\n<div class=\"cs-seg-hint\">0\u201323<\/div>\r\n<\/div>\r\n<div class=\"cs-seg\" id=\"pth-seg-2\" role=\"button\" tabindex=\"0\" aria-label=\"Day of month field\" title=\"Click to edit Day of Month\">\r\n<div class=\"cs-seg-val\" id=\"pth-sv-2\">*<\/div>\r\n<div class=\"cs-seg-lbl\">Day (Mo)<\/div>\r\n<div class=\"cs-seg-hint\">1\u201331<\/div>\r\n<\/div>\r\n<div class=\"cs-seg\" id=\"pth-seg-3\" role=\"button\" tabindex=\"0\" aria-label=\"Month field\" title=\"Click to edit Month\">\r\n<div class=\"cs-seg-val\" id=\"pth-sv-3\">*<\/div>\r\n<div class=\"cs-seg-lbl\">Month<\/div>\r\n<div class=\"cs-seg-hint\">1\u201312<\/div>\r\n<\/div>\r\n<div class=\"cs-seg\" id=\"pth-seg-4\" role=\"button\" tabindex=\"0\" aria-label=\"Day of week field\" title=\"Click to edit Day of Week\">\r\n<div class=\"cs-seg-val\" id=\"pth-sv-4\">1-5<\/div>\r\n<div class=\"cs-seg-lbl\">Day (Wk)<\/div>\r\n<div class=\"cs-seg-hint\">0\u20136<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-tabs\" role=\"tablist\">\r\n<button type=\"button\" class=\"cs-tab on\" id=\"pth-t-builder\" role=\"tab\" aria-selected=\"true\" aria-controls=\"pth-p-builder\">\ud83d\udcc5 Next Runs<\/button>\r\n<button type=\"button\" class=\"cs-tab\" id=\"pth-t-presets\" role=\"tab\" aria-selected=\"false\" aria-controls=\"pth-p-presets\">\u26a1 Presets<\/button>\r\n<button type=\"button\" class=\"cs-tab\" id=\"pth-t-visual\" role=\"tab\" aria-selected=\"false\" aria-controls=\"pth-p-visual\">\ud83d\udd27 Visual Builder<\/button>\r\n<button type=\"button\" class=\"cs-tab\" id=\"pth-t-ref\" role=\"tab\" aria-selected=\"false\" aria-controls=\"pth-p-ref\">\ud83d\udccb Reference<\/button>\r\n<\/div>\r\n\r\n<div class=\"cs-panel on\" id=\"pth-p-builder\" role=\"tabpanel\" aria-labelledby=\"pth-t-builder\">\r\n\r\n<div class=\"cs-tz-bar\">\r\n<label for=\"pth-cron-tz\" style=\"text-transform:none;font-size:12px;margin:0;white-space:nowrap;\">\ud83c\udf10 Timezone:<\/label>\r\n<select id=\"pth-cron-tz\" style=\"flex:1;font-size:12px;padding:5px 8px;\" aria-label=\"Timezone for next runs\">\r\n<option value=\"local\">Local (Browser)<\/option>\r\n<option value=\"UTC\">UTC<\/option>\r\n<option value=\"America\/New_York\">US Eastern (ET)<\/option>\r\n<option value=\"America\/Chicago\">US Central (CT)<\/option>\r\n<option value=\"America\/Denver\">US Mountain (MT)<\/option>\r\n<option value=\"America\/Los_Angeles\">US Pacific (PT)<\/option>\r\n<option value=\"Europe\/London\">UK (GMT\/BST)<\/option>\r\n<option value=\"Europe\/Paris\">Central Europe (CET)<\/option>\r\n<option value=\"Europe\/Berlin\">Germany (CET)<\/option>\r\n<option value=\"Asia\/Kolkata\">India (IST)<\/option>\r\n<option value=\"Asia\/Colombo\">Sri Lanka (IST)<\/option>\r\n<option value=\"Asia\/Tokyo\">Japan (JST)<\/option>\r\n<option value=\"Asia\/Shanghai\">China (CST)<\/option>\r\n<option value=\"Asia\/Singapore\">Singapore (SGT)<\/option>\r\n<option value=\"Australia\/Sydney\">Sydney (AEST)<\/option>\r\n<\/select>\r\n<select id=\"pth-cron-runcount\" style=\"width:90px;font-size:12px;padding:5px 8px;\" aria-label=\"Number of next runs to show\">\r\n<option value=\"5\">5 runs<\/option>\r\n<option value=\"10\" selected>10 runs<\/option>\r\n<option value=\"20\">20 runs<\/option>\r\n<\/select>\r\n<\/div>\r\n\r\n<div class=\"cs-diff\" id=\"pth-cron-diff\"><\/div>\r\n\r\n<div style=\"background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;\">\r\n<div style=\"background:#f8fafc;padding:8px 14px;border-bottom:1px solid #e2e8f0;display:flex;justify-content:space-between;align-items:center;\">\r\n<span style=\"font-size:11px;font-weight:800;color:#0f172a;text-transform:uppercase;letter-spacing:0.5px;\">\ud83d\udcc5 Upcoming Executions<\/span>\r\n<span class=\"cs-chip\" id=\"pth-cron-runbadge\">\u2014 \/ \u2014<\/span>\r\n<\/div>\r\n<ul class=\"cs-runs-list\" id=\"pth-cron-runs\">\r\n<li style=\"color:#64748b;font-style:italic;\">Enter a valid cron expression above<\/li>\r\n<\/ul>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-panel\" id=\"pth-p-presets\" role=\"tabpanel\" aria-labelledby=\"pth-t-presets\">\r\n<div class=\"cs-preset-search cs-fld\">\r\n<input type=\"text\" id=\"pth-preset-search\" placeholder=\"\ud83d\udd0d Search presets... (e.g. backup, midnight, weekly)\" aria-label=\"Search presets\">\r\n<\/div>\r\n<div class=\"cs-preset-cats\" id=\"pth-preset-cats\">\r\n<button type=\"button\" class=\"cs-cat-btn on\" data-cat=\"all\" aria-label=\"Show all presets\">All<\/button>\r\n<button type=\"button\" class=\"cs-cat-btn\" data-cat=\"common\" aria-label=\"Common presets\">\u2b50 Common<\/button>\r\n<button type=\"button\" class=\"cs-cat-btn\" data-cat=\"backup\" aria-label=\"Backup presets\">\ud83d\udcbe Backups<\/button>\r\n<button type=\"button\" class=\"cs-cat-btn\" data-cat=\"web\" aria-label=\"Web maintenance presets\">\ud83c\udf10 Web<\/button>\r\n<button type=\"button\" class=\"cs-cat-btn\" data-cat=\"report\" aria-label=\"Report presets\">\ud83d\udcca Reports<\/button>\r\n<button type=\"button\" class=\"cs-cat-btn\" data-cat=\"system\" aria-label=\"System presets\">\u2699\ufe0f System<\/button>\r\n<\/div>\r\n<div class=\"cs-preset-grid\" id=\"pth-preset-grid\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-panel\" id=\"pth-p-visual\" role=\"tabpanel\" aria-labelledby=\"pth-t-visual\">\r\n\r\n<div class=\"cs-vb-mode-btns\">\r\n<button type=\"button\" class=\"cs-vb-mode on\" data-mode=\"interval\" aria-label=\"Interval mode\">\ud83d\udd04 Interval<\/button>\r\n<button type=\"button\" class=\"cs-vb-mode\" data-mode=\"daily\" aria-label=\"Daily mode\">\u2600\ufe0f Daily<\/button>\r\n<button type=\"button\" class=\"cs-vb-mode\" data-mode=\"weekly\" aria-label=\"Weekly mode\">\ud83d\udcc5 Weekly<\/button>\r\n<button type=\"button\" class=\"cs-vb-mode\" data-mode=\"monthly\" aria-label=\"Monthly mode\">\ud83d\udcc6 Monthly<\/button>\r\n<button type=\"button\" class=\"cs-vb-mode\" data-mode=\"advanced\" aria-label=\"Advanced mode\">\ud83d\udd27 Advanced<\/button>\r\n<\/div>\r\n\r\n<div class=\"cs-vb-section on\" id=\"pth-vb-interval\">\r\n<div class=\"cs-sh\" style=\"margin-top:0;\">\ud83d\udd04 Run Every...<\/div>\r\n<div class=\"cs-g2\">\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-int-val\">Interval Value<\/label>\r\n<input type=\"number\" id=\"pth-vb-int-val\" value=\"5\" min=\"1\" max=\"59\" aria-label=\"Interval value\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-int-unit\">Unit<\/label>\r\n<select id=\"pth-vb-int-unit\" aria-label=\"Interval unit\">\r\n<option value=\"minute\">Minutes<\/option>\r\n<option value=\"hour\">Hours<\/option>\r\n<\/select>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-vb-section\" id=\"pth-vb-daily\">\r\n<div class=\"cs-sh\" style=\"margin-top:0;\">\u2600\ufe0f Run Daily at...<\/div>\r\n<div class=\"cs-g2\">\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-d-h\">Hour (0\u201323)<\/label>\r\n<input type=\"number\" id=\"pth-vb-d-h\" value=\"0\" min=\"0\" max=\"23\" aria-label=\"Hour\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-d-m\">Minute (0\u201359)<\/label>\r\n<input type=\"number\" id=\"pth-vb-d-m\" value=\"0\" min=\"0\" max=\"59\" aria-label=\"Minute\">\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-vb-section\" id=\"pth-vb-weekly\">\r\n<div class=\"cs-sh\" style=\"margin-top:0;\">\ud83d\udcc5 Days of Week<\/div>\r\n<div class=\"cs-dow-grid\" id=\"pth-vb-dow\">\r\n<button type=\"button\" class=\"cs-dow-btn\" data-dow=\"0\" aria-label=\"Sunday\" aria-pressed=\"false\">Sun<\/button>\r\n<button type=\"button\" class=\"cs-dow-btn on\" data-dow=\"1\" aria-label=\"Monday\" aria-pressed=\"true\">Mon<\/button>\r\n<button type=\"button\" class=\"cs-dow-btn on\" data-dow=\"2\" aria-label=\"Tuesday\" aria-pressed=\"true\">Tue<\/button>\r\n<button type=\"button\" class=\"cs-dow-btn on\" data-dow=\"3\" aria-label=\"Wednesday\" aria-pressed=\"true\">Wed<\/button>\r\n<button type=\"button\" class=\"cs-dow-btn on\" data-dow=\"4\" aria-label=\"Thursday\" aria-pressed=\"true\">Thu<\/button>\r\n<button type=\"button\" class=\"cs-dow-btn on\" data-dow=\"5\" aria-label=\"Friday\" aria-pressed=\"true\">Fri<\/button>\r\n<button type=\"button\" class=\"cs-dow-btn\" data-dow=\"6\" aria-label=\"Saturday\" aria-pressed=\"false\">Sat<\/button>\r\n<\/div>\r\n<div class=\"cs-g2\" style=\"margin-top:12px;\">\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-w-h\">Hour<\/label>\r\n<input type=\"number\" id=\"pth-vb-w-h\" value=\"9\" min=\"0\" max=\"23\" aria-label=\"Hour for weekly\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-w-m\">Minute<\/label>\r\n<input type=\"number\" id=\"pth-vb-w-m\" value=\"0\" min=\"0\" max=\"59\" aria-label=\"Minute for weekly\">\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-vb-section\" id=\"pth-vb-monthly\">\r\n<div class=\"cs-sh\" style=\"margin-top:0;\">\ud83d\udcc6 Days of Month<\/div>\r\n<div class=\"cs-dom-grid\" id=\"pth-vb-dom\"><\/div>\r\n<div class=\"cs-g3\" style=\"margin-top:12px;\">\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-mo-h\">Hour<\/label>\r\n<input type=\"number\" id=\"pth-vb-mo-h\" value=\"0\" min=\"0\" max=\"23\" aria-label=\"Hour for monthly\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-mo-m\">Minute<\/label>\r\n<input type=\"number\" id=\"pth-vb-mo-m\" value=\"0\" min=\"0\" max=\"59\" aria-label=\"Minute for monthly\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-vb-mo-mon\">Months<\/label>\r\n<select id=\"pth-vb-mo-mon\" aria-label=\"Months for monthly\">\r\n<option value=\"*\">Every Month<\/option>\r\n<option value=\"1,4,7,10\">Quarterly<\/option>\r\n<option value=\"1,7\">Biannual<\/option>\r\n<option value=\"1\">January only<\/option>\r\n<\/select>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-vb-section\" id=\"pth-vb-advanced\">\r\n<div class=\"cs-sh\" style=\"margin-top:0;\">\ud83d\udd27 Field-by-Field Builder<\/div>\r\n<div class=\"cs-g2\">\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-adv-min\">Minute<\/label>\r\n<input type=\"text\" id=\"pth-adv-min\" value=\"*\" placeholder=\"0-59 or *\/5 or 0,30\" aria-label=\"Advanced minute\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-adv-hr\">Hour<\/label>\r\n<input type=\"text\" id=\"pth-adv-hr\" value=\"*\" placeholder=\"0-23 or 9,17\" aria-label=\"Advanced hour\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-adv-dom\">Day (Month)<\/label>\r\n<input type=\"text\" id=\"pth-adv-dom\" value=\"*\" placeholder=\"1-31 or 1,15\" aria-label=\"Advanced day of month\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-adv-mon\">Month<\/label>\r\n<input type=\"text\" id=\"pth-adv-mon\" value=\"*\" placeholder=\"1-12 or JAN,JUL\" aria-label=\"Advanced month\">\r\n<\/div>\r\n<div class=\"cs-fld\">\r\n<label for=\"pth-adv-dow\">Day (Week)<\/label>\r\n<input type=\"text\" id=\"pth-adv-dow\" value=\"*\" placeholder=\"0-6 or MON-FRI\" aria-label=\"Advanced day of week\">\r\n<\/div>\r\n<div class=\"cs-fld\" style=\"display:flex;flex-direction:column;justify-content:flex-end;\">\r\n<button type=\"button\" class=\"cs-btn bn-blue\" id=\"pth-adv-apply\" style=\"width:100%;margin-top:auto;\" aria-label=\"Apply advanced fields\">\u2705 Apply<\/button>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-vb-preview\" id=\"pth-vb-preview\" aria-live=\"polite\">0 9 * * 1-5<\/div>\r\n<div style=\"display:flex;gap:8px;margin-top:10px;\">\r\n<button type=\"button\" class=\"cs-btn bn-blue\" id=\"pth-vb-apply\" style=\"flex:1;\" aria-label=\"Apply generated cron expression\">\u2705 Use This Expression<\/button>\r\n<button type=\"button\" class=\"cs-btn bn-grey\" id=\"pth-vb-reset\" style=\"flex:0 0 auto;\" aria-label=\"Reset visual builder\">\u21a9\ufe0f Reset<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-panel\" id=\"pth-p-ref\" role=\"tabpanel\" aria-labelledby=\"pth-t-ref\">\r\n\r\n<div class=\"cs-sh\" style=\"margin-top:0;\">\ud83d\udcd0 Field Reference<\/div>\r\n<table class=\"cs-ref-table\" role=\"table\" aria-label=\"Cron field reference\">\r\n<thead><tr><th>Field<\/th><th>Position<\/th><th>Range<\/th><th>Examples<\/th><\/tr><\/thead>\r\n<tbody>\r\n<tr><td><strong>Minute<\/strong><\/td><td>1st<\/td><td><span class=\"cs-code\">0\u201359<\/span><\/td><td><span class=\"cs-code\">0<\/span> <span class=\"cs-code\">*\/15<\/span> <span class=\"cs-code\">0,30<\/span><\/td><\/tr>\r\n<tr><td><strong>Hour<\/strong><\/td><td>2nd<\/td><td><span class=\"cs-code\">0\u201323<\/span><\/td><td><span class=\"cs-code\">9<\/span> <span class=\"cs-code\">*\/4<\/span> <span class=\"cs-code\">9,17<\/span><\/td><\/tr>\r\n<tr><td><strong>Day (Month)<\/strong><\/td><td>3rd<\/td><td><span class=\"cs-code\">1\u201331<\/span><\/td><td><span class=\"cs-code\">1<\/span> <span class=\"cs-code\">15<\/span> <span class=\"cs-code\">1,15<\/span><\/td><\/tr>\r\n<tr><td><strong>Month<\/strong><\/td><td>4th<\/td><td><span class=\"cs-code\">1\u201312<\/span><\/td><td><span class=\"cs-code\">*<\/span> <span class=\"cs-code\">1,7<\/span> <span class=\"cs-code\">JAN<\/span><\/td><\/tr>\r\n<tr><td><strong>Day (Week)<\/strong><\/td><td>5th<\/td><td><span class=\"cs-code\">0\u20136<\/span><\/td><td><span class=\"cs-code\">1-5<\/span> <span class=\"cs-code\">0,6<\/span> <span class=\"cs-code\">MON<\/span><\/td><\/tr>\r\n<\/tbody>\r\n<\/table>\r\n\r\n<div class=\"cs-sh\">\u2728 Special Characters<\/div>\r\n<table class=\"cs-ref-table\">\r\n<thead><tr><th>Char<\/th><th>Meaning<\/th><th>Example<\/th><\/tr><\/thead>\r\n<tbody>\r\n<tr><td><span class=\"cs-code\">*<\/span><\/td><td>Any value (wildcard)<\/td><td><span class=\"cs-code\">* * * * *<\/span> = every minute<\/td><\/tr>\r\n<tr><td><span class=\"cs-code\">,<\/span><\/td><td>List separator<\/td><td><span class=\"cs-code\">1,15<\/span> = 1st and 15th<\/td><\/tr>\r\n<tr><td><span class=\"cs-code\">-<\/span><\/td><td>Range<\/td><td><span class=\"cs-code\">1-5<\/span> = Monday to Friday<\/td><\/tr>\r\n<tr><td><span class=\"cs-code\">\/<\/span><\/td><td>Step \/ interval<\/td><td><span class=\"cs-code\">*\/10<\/span> = every 10 units<\/td><\/tr>\r\n<tr><td><span class=\"cs-code\">?<\/span><\/td><td>No specific value (some systems)<\/td><td><span class=\"cs-code\">0 0 ? * MON<\/span><\/td><\/tr>\r\n<\/tbody>\r\n<\/table>\r\n\r\n<div class=\"cs-sh\">@Special Strings (Shorthand)<\/div>\r\n<div class=\"cs-special-grid\" id=\"pth-special-grid\">\r\n<span class=\"cs-sp-code\">@reboot<\/span><span class=\"cs-sp-desc\">Run once at startup<\/span><span class=\"cs-sp-apply\" data-val=\"@reboot\" role=\"button\" tabindex=\"0\" aria-label=\"Use @reboot\">Use<\/span>\r\n<span class=\"cs-sp-code\">@yearly<\/span><span class=\"cs-sp-desc\">Once a year (Jan 1, midnight)<\/span><span class=\"cs-sp-apply\" data-val=\"0 0 1 1 *\" role=\"button\" tabindex=\"0\" aria-label=\"Use @yearly equivalent\">Use<\/span>\r\n<span class=\"cs-sp-code\">@monthly<\/span><span class=\"cs-sp-desc\">Once a month (1st, midnight)<\/span><span class=\"cs-sp-apply\" data-val=\"0 0 1 * *\" role=\"button\" tabindex=\"0\" aria-label=\"Use @monthly equivalent\">Use<\/span>\r\n<span class=\"cs-sp-code\">@weekly<\/span><span class=\"cs-sp-desc\">Once a week (Sunday midnight)<\/span><span class=\"cs-sp-apply\" data-val=\"0 0 * * 0\" role=\"button\" tabindex=\"0\" aria-label=\"Use @weekly equivalent\">Use<\/span>\r\n<span class=\"cs-sp-code\">@daily<\/span><span class=\"cs-sp-desc\">Once a day (midnight)<\/span><span class=\"cs-sp-apply\" data-val=\"0 0 * * *\" role=\"button\" tabindex=\"0\" aria-label=\"Use @daily equivalent\">Use<\/span>\r\n<span class=\"cs-sp-code\">@hourly<\/span><span class=\"cs-sp-desc\">Once an hour (top of hour)<\/span><span class=\"cs-sp-apply\" data-val=\"0 * * * *\" role=\"button\" tabindex=\"0\" aria-label=\"Use @hourly equivalent\">Use<\/span>\r\n<\/div>\r\n\r\n<div class=\"cs-sh\">\ud83d\udda5\ufe0f Platform Differences<\/div>\r\n<div class=\"cs-platform-card\">\r\n<div class=\"cs-platform-name\">\ud83d\udc27 Linux crontab<\/div>\r\n<div class=\"cs-platform-note\">Standard 5-field format. Runs as the user who created it. Use <span class=\"cs-code\">crontab -e<\/span> to edit. Supports @reboot, @yearly etc. No seconds field.<\/div>\r\n<\/div>\r\n<div class=\"cs-platform-card\">\r\n<div class=\"cs-platform-name\">\u2601\ufe0f AWS EventBridge<\/div>\r\n<div class=\"cs-platform-note\">Uses 6-field format with year: <span class=\"cs-code\">min hr day month dow year<\/span>. Requires ? for either day-of-month OR day-of-week (not both as *). Always UTC.<\/div>\r\n<\/div>\r\n<div class=\"cs-platform-card\">\r\n<div class=\"cs-platform-name\">\ud83d\udc19 GitHub Actions<\/div>\r\n<div class=\"cs-platform-note\">Standard 5-field UTC cron. Minimum interval is 5 minutes. Use <span class=\"cs-code\">on: schedule: - cron: '...'<\/span> syntax. Runs in UTC.<\/div>\r\n<\/div>\r\n<div class=\"cs-platform-card\">\r\n<div class=\"cs-platform-name\">\ud83d\udd35 WordPress WP-Cron<\/div>\r\n<div class=\"cs-platform-note\">Not a real cron \u2014 fires on page load. For reliability, disable it in wp-config.php and add a real server cron: <span class=\"cs-code\">*\/5 * * * * php \/path\/to\/wp-cron.php<\/span><\/div>\r\n<\/div>\r\n<div class=\"cs-platform-card\">\r\n<div class=\"cs-platform-name\">\ud83d\udfe0 Cloudflare Workers<\/div>\r\n<div class=\"cs-platform-note\">Uses standard 5-field cron triggers. Defined in <span class=\"cs-code\">wrangler.toml<\/span> under <span class=\"cs-code\">[triggers] crons<\/span>. Always UTC. Minimum 1 minute.<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<\/div><\/div><div class=\"cs-sidebar\">\r\n<div class=\"cs-sb-card\">\r\n<div class=\"cs-sb-head\">\ud83d\udcca Expression Analyser<\/div>\r\n<div class=\"cs-sb-body\" id=\"pth-cron-analyser\">\r\n<div style=\"font-size:12px;color:#475569;\">Enter an expression to see analysis<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-sb-card\">\r\n<div class=\"cs-sb-head\">\ud83d\udca1 Tips<\/div>\r\n<div class=\"cs-sb-body\">\r\n<div class=\"cs-tip\"><span class=\"cs-tip-icon\">\ud83d\udd04<\/span><div class=\"cs-tip-text\"><strong>Visual Builder<\/strong>Build cron expressions by clicking \u2014 no syntax knowledge needed.<\/div><\/div>\r\n<div class=\"cs-tip\"><span class=\"cs-tip-icon\">\u26a1<\/span><div class=\"cs-tip-text\"><strong>20+ Presets<\/strong>Searchable library covering backups, web, reports, and system tasks.<\/div><\/div>\r\n<div class=\"cs-tip\"><span class=\"cs-tip-icon\">\ud83c\udf10<\/span><div class=\"cs-tip-text\"><strong>Timezone Aware<\/strong>Next runs shown in your chosen timezone.<\/div><\/div>\r\n<div class=\"cs-tip\"><span class=\"cs-tip-icon\">\ud83d\udccb<\/span><div class=\"cs-tip-text\"><strong>Click Segments<\/strong>Click any field box above the tabs to jump to Visual Builder for that field.<\/div><\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"cs-sb-card\">\r\n<div class=\"cs-sb-head\">\ud83d\udd22 Quick Syntax<\/div>\r\n<div class=\"cs-sb-body\" style=\"padding:10px;\">\r\n<table style=\"width:100%;border-collapse:collapse;font-size:11px;\">\r\n<tr><td style=\"padding:4px 6px;font-family:monospace;color:#1d4ed8;font-weight:700;\">*<\/td><td style=\"padding:4px 6px;color:#334155;\">Any value<\/td><\/tr>\r\n<tr style=\"background:#f8fafc;\"><td style=\"padding:4px 6px;font-family:monospace;color:#1d4ed8;font-weight:700;\">*\/5<\/td><td style=\"padding:4px 6px;color:#334155;\">Every 5 units<\/td><\/tr>\r\n<tr><td style=\"padding:4px 6px;font-family:monospace;color:#1d4ed8;font-weight:700;\">1-5<\/td><td style=\"padding:4px 6px;color:#334155;\">Range 1 to 5<\/td><\/tr>\r\n<tr style=\"background:#f8fafc;\"><td style=\"padding:4px 6px;font-family:monospace;color:#1d4ed8;font-weight:700;\">1,15<\/td><td style=\"padding:4px 6px;color:#334155;\">List: 1 and 15<\/td><\/tr>\r\n<tr><td style=\"padding:4px 6px;font-family:monospace;color:#1d4ed8;font-weight:700;\">0 9 * * 1<\/td><td style=\"padding:4px 6px;color:#334155;\">Mon 9 AM<\/td><\/tr>\r\n<tr style=\"background:#f8fafc;\"><td style=\"padding:4px 6px;font-family:monospace;color:#1d4ed8;font-weight:700;\">0 0 1 * *<\/td><td style=\"padding:4px 6px;color:#334155;\">1st of month<\/td><\/tr>\r\n<\/table>\r\n<\/div>\r\n<\/div>\r\n<\/div><\/div><\/div><script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\n(function(){\r\n'use strict';\r\n\r\n\/* ===== PRESETS DATA ===== *\/\r\nvar PRESETS = [\r\n{name:'Every Minute',code:'* * * * *',desc:'Runs every single minute',cat:'common'},\r\n{name:'Every 5 Minutes',code:'*\/5 * * * *',desc:'Runs every 5 minutes',cat:'common'},\r\n{name:'Every 15 Minutes',code:'*\/15 * * * *',desc:'Runs every 15 minutes',cat:'common'},\r\n{name:'Every 30 Minutes',code:'*\/30 * * * *',desc:'Runs every 30 minutes',cat:'common'},\r\n{name:'Every Hour',code:'0 * * * *',desc:'Top of every hour',cat:'common'},\r\n{name:'Every 2 Hours',code:'0 *\/2 * * *',desc:'Every 2 hours on the hour',cat:'common'},\r\n{name:'Daily Midnight',code:'0 0 * * *',desc:'Every day at 12:00 AM',cat:'common'},\r\n{name:'Daily Noon',code:'0 12 * * *',desc:'Every day at 12:00 PM',cat:'common'},\r\n{name:'Daily 9 AM',code:'0 9 * * *',desc:'Every morning at 9 AM',cat:'common'},\r\n{name:'Weekdays 9 AM',code:'0 9 * * 1-5',desc:'Mon\u2013Fri at 9:00 AM',cat:'common'},\r\n{name:'Weekly Backup',code:'0 2 * * 0',desc:'Every Sunday at 2 AM',cat:'backup'},\r\n{name:'Daily Backup',code:'0 3 * * *',desc:'Every day at 3 AM',cat:'backup'},\r\n{name:'Monthly Backup',code:'0 1 1 * *',desc:'1st of each month at 1 AM',cat:'backup'},\r\n{name:'Hourly Backup',code:'0 * * * *',desc:'Every hour on the hour',cat:'backup'},\r\n{name:'DB Backup Weekdays',code:'0 1 * * 1-5',desc:'Mon\u2013Fri at 1 AM',cat:'backup'},\r\n{name:'Quarterly Backup',code:'0 0 1 1,4,7,10 *',desc:'1st day of each quarter',cat:'backup'},\r\n{name:'Cache Clear',code:'0 *\/6 * * *',desc:'Clear cache every 6 hours',cat:'web'},\r\n{name:'Sitemap Update',code:'0 0 * * 0',desc:'Rebuild sitemap weekly',cat:'web'},\r\n{name:'SSL Check',code:'0 8 * * *',desc:'Check SSL cert daily',cat:'web'},\r\n{name:'WP Cron Trigger',code:'*\/5 * * * *',desc:'Fire WordPress WP-Cron every 5 min',cat:'web'},\r\n{name:'Log Rotation',code:'0 0 * * *',desc:'Rotate logs at midnight',cat:'web'},\r\n{name:'Daily Report',code:'0 8 * * *',desc:'Send daily report at 8 AM',cat:'report'},\r\n{name:'Weekly Report',code:'0 9 * * 1',desc:'Monday morning report',cat:'report'},\r\n{name:'Monthly Report',code:'0 7 1 * *',desc:'1st of month at 7 AM',cat:'report'},\r\n{name:'End of Day Summary',code:'0 17 * * 1-5',desc:'Weekday 5 PM summary',cat:'report'},\r\n{name:'Temp File Cleanup',code:'0 4 * * *',desc:'Clean temp files at 4 AM',cat:'system'},\r\n{name:'Disk Check',code:'0 6 * * *',desc:'Check disk space at 6 AM',cat:'system'},\r\n{name:'Restart Service',code:'0 0 * * 0',desc:'Restart service Sunday midnight',cat:'system'},\r\n{name:'Health Check',code:'*\/10 * * * *',desc:'System health check every 10 min',cat:'system'},\r\n{name:'Session Cleanup',code:'0 *\/4 * * *',desc:'Clean expired sessions every 4h',cat:'system'}\r\n];\r\n\r\n\/* ===== MONTH\/DAY NAMES ===== *\/\r\nvar MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\r\nvar DAYS   = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];\r\nvar MONTH_MAP = {JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12};\r\nvar DOW_MAP   = {SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6};\r\n\r\nwindow.pthCronApp = {\r\n  initialized: false,\r\n  vbMode: 'interval',\r\n\r\n  \/* ===== TOAST ===== *\/\r\n  toast: function(msg, type) {\r\n    var c = document.getElementById('pth-cron-toast');\r\n    if (!c) return;\r\n    var el = document.createElement('div');\r\n    var bg = type === 'error' ? '#dc2626' : (type === 'info' ? '#2563eb' : '#059669');\r\n    el.style.cssText = 'padding:11px 18px;border-radius:10px;font-size:13px;font-weight:600;color:#fff;pointer-events:auto;box-shadow:0 4px 15px rgba(0,0,0,0.15);font-family:Inter,system-ui,sans-serif;background:' + bg + ';';\r\n    el.textContent = msg;\r\n    c.appendChild(el);\r\n    setTimeout(function() { if (el.parentNode) el.parentNode.removeChild(el); }, 3000);\r\n  },\r\n\r\n  esc: function(s) {\r\n    return String(s).replace(\/[&<>'\"]\/g, function(c) {\r\n      return {'&':'&amp;','<':'&lt;','>':'&gt;',\"'\":'&#39;','\"':'&quot;'}[c];\r\n    });\r\n  },\r\n\r\n  \/* ===== INIT ===== *\/\r\n  init: function() {\r\n    this.attachEvents();\r\n    this.buildDomGrid();\r\n    this.buildPresets('all', '');\r\n    this.processCron();\r\n    this.updateVbPreview();\r\n  },\r\n\r\n  \/* ===== TAB SWITCH ===== *\/\r\n  switchTab: function(tab) {\r\n    var tabs = ['builder','presets','visual','ref'];\r\n    for (var i = 0; i < tabs.length; i++) {\r\n      var btn = document.getElementById('pth-t-' + tabs[i]);\r\n      var panel = document.getElementById('pth-p-' + tabs[i]);\r\n      var on = tabs[i] === tab;\r\n      if (btn) { btn.classList.toggle('on', on); btn.setAttribute('aria-selected', on ? 'true' : 'false'); }\r\n      if (panel) panel.classList.toggle('on', on);\r\n    }\r\n  },\r\n\r\n  \/* ===== EVENTS ===== *\/\r\n  attachEvents: function() {\r\n    var S = this;\r\n\r\n    \/* Tabs *\/\r\n    ['builder','presets','visual','ref'].forEach(function(t) {\r\n      var btn = document.getElementById('pth-t-' + t);\r\n      if (btn) btn.addEventListener('click', function() { S.switchTab(t); });\r\n    });\r\n\r\n    \/* Full width *\/\r\n    var fw = document.getElementById('pth-cron-fw');\r\n    if (fw) fw.addEventListener('click', function() {\r\n      var o = document.getElementById('pth-cron-outer');\r\n      if (!o) return;\r\n      o.classList.toggle('cs-full');\r\n      fw.textContent = o.classList.contains('cs-full') ? '\u25e8 Split View' : '\u26f6 Full Width';\r\n    });\r\n\r\n    \/* Sample + Clear *\/\r\n    var smp = document.getElementById('pth-cron-sample');\r\n    if (smp) smp.addEventListener('click', function() { S.loadSample(); });\r\n    var clr = document.getElementById('pth-cron-clear');\r\n    if (clr) clr.addEventListener('click', function() { S.clearAll(); });\r\n\r\n    \/* Main input *\/\r\n    var inp = document.getElementById('pth-cron-input');\r\n    if (inp) inp.addEventListener('input', function() { S.processCron(); });\r\n\r\n    \/* Copy (Upgraded for universal compatibility) *\/\r\n    var cp = document.getElementById('pth-cron-copy');\r\n    if (cp) cp.addEventListener('click', function() {\r\n      var v = document.getElementById('pth-cron-input').value;\r\n      if (navigator.clipboard && window.isSecureContext) {\r\n        navigator.clipboard.writeText(v).then(function() { S.toast('\ud83d\udccb Copied: ' + v, 'success'); })\r\n          .catch(function() { S.toast('\u26a0\ufe0f Copy failed', 'error'); });\r\n      } else {\r\n        \/* Fallback for HTTP environments *\/\r\n        var textArea = document.createElement(\"textarea\");\r\n        textArea.value = v;\r\n        textArea.style.position = \"fixed\";\r\n        textArea.style.left = \"-999999px\";\r\n        document.body.appendChild(textArea);\r\n        textArea.focus();\r\n        textArea.select();\r\n        try {\r\n          document.execCommand('copy');\r\n          S.toast('\ud83d\udccb Copied: ' + v, 'success');\r\n        } catch (err) {\r\n          S.toast('\u26a0\ufe0f Copy failed', 'error');\r\n        }\r\n        textArea.remove();\r\n      }\r\n    });\r\n\r\n    \/* Timezone + count *\/\r\n    var tz = document.getElementById('pth-cron-tz');\r\n    if (tz) tz.addEventListener('change', function() { S.processCron(); });\r\n    var rc = document.getElementById('pth-cron-runcount');\r\n    if (rc) rc.addEventListener('change', function() { S.processCron(); });\r\n\r\n    \/* Segment clicks \u2192 jump to visual builder *\/\r\n    for (var si = 0; si < 5; si++) {\r\n      (function(idx) {\r\n        var seg = document.getElementById('pth-seg-' + idx);\r\n        if (seg) seg.addEventListener('click', function() {\r\n          S.switchTab('visual');\r\n          S.setVbMode('advanced');\r\n        });\r\n        if (seg) seg.addEventListener('keydown', function(e) {\r\n          if (e.key === 'Enter' || e.key === ' ') { S.switchTab('visual'); S.setVbMode('advanced'); }\r\n        });\r\n      })(si);\r\n    }\r\n\r\n    \/* Preset search + cat filter *\/\r\n    var ps = document.getElementById('pth-preset-search');\r\n    if (ps) ps.addEventListener('input', function() {\r\n      var activeCat = document.querySelector('#pth-preset-cats .cs-cat-btn.on');\r\n      S.buildPresets(activeCat ? activeCat.dataset.cat : 'all', this.value);\r\n    });\r\n    var catBtns = document.querySelectorAll('#pth-preset-cats .cs-cat-btn');\r\n    catBtns.forEach(function(btn) {\r\n      btn.addEventListener('click', function() {\r\n        catBtns.forEach(function(b) { b.classList.remove('on'); });\r\n        btn.classList.add('on');\r\n        var srch = document.getElementById('pth-preset-search');\r\n        S.buildPresets(btn.dataset.cat, srch ? srch.value : '');\r\n      });\r\n    });\r\n\r\n    \/* VB mode buttons *\/\r\n    var vbBtns = document.querySelectorAll('.cs-vb-mode');\r\n    vbBtns.forEach(function(btn) {\r\n      btn.addEventListener('click', function() { S.setVbMode(btn.dataset.mode); });\r\n    });\r\n\r\n    \/* VB interval *\/\r\n    var vbIntV = document.getElementById('pth-vb-int-val');\r\n    var vbIntU = document.getElementById('pth-vb-int-unit');\r\n    if (vbIntV) vbIntV.addEventListener('input', function() { S.updateVbPreview(); });\r\n    if (vbIntU) vbIntU.addEventListener('change', function() { S.updateVbPreview(); });\r\n\r\n    \/* VB daily *\/\r\n    var vbDH = document.getElementById('pth-vb-d-h');\r\n    var vbDM = document.getElementById('pth-vb-d-m');\r\n    if (vbDH) vbDH.addEventListener('input', function() { S.updateVbPreview(); });\r\n    if (vbDM) vbDM.addEventListener('input', function() { S.updateVbPreview(); });\r\n\r\n    \/* VB weekly DOW *\/\r\n    document.querySelectorAll('.cs-dow-btn').forEach(function(btn) {\r\n      btn.addEventListener('click', function() {\r\n        btn.classList.toggle('on');\r\n        btn.setAttribute('aria-pressed', btn.classList.contains('on') ? 'true' : 'false');\r\n        S.updateVbPreview();\r\n      });\r\n    });\r\n    var vbWH = document.getElementById('pth-vb-w-h');\r\n    var vbWM = document.getElementById('pth-vb-w-m');\r\n    if (vbWH) vbWH.addEventListener('input', function() { S.updateVbPreview(); });\r\n    if (vbWM) vbWM.addEventListener('input', function() { S.updateVbPreview(); });\r\n\r\n    \/* VB monthly *\/\r\n    var vbMoH = document.getElementById('pth-vb-mo-h');\r\n    var vbMoM = document.getElementById('pth-vb-mo-m');\r\n    var vbMoMon = document.getElementById('pth-vb-mo-mon');\r\n    if (vbMoH) vbMoH.addEventListener('input', function() { S.updateVbPreview(); });\r\n    if (vbMoM) vbMoM.addEventListener('input', function() { S.updateVbPreview(); });\r\n    if (vbMoMon) vbMoMon.addEventListener('change', function() { S.updateVbPreview(); });\r\n\r\n    \/* VB advanced apply *\/\r\n    var advApply = document.getElementById('pth-adv-apply');\r\n    if (advApply) advApply.addEventListener('click', function() { S.applyAdvanced(); });\r\n\r\n    \/* VB use + reset *\/\r\n    var vbApply = document.getElementById('pth-vb-apply');\r\n    if (vbApply) vbApply.addEventListener('click', function() {\r\n      var preview = document.getElementById('pth-vb-preview');\r\n      if (preview) {\r\n        var inp2 = document.getElementById('pth-cron-input');\r\n        if (inp2) { inp2.value = preview.textContent; S.processCron(); S.switchTab('builder'); S.toast('\u2705 Expression applied!', 'success'); }\r\n      }\r\n    });\r\n    var vbReset = document.getElementById('pth-vb-reset');\r\n    if (vbReset) vbReset.addEventListener('click', function() { S.resetVb(); });\r\n\r\n    \/* Reference @special apply *\/\r\n    document.querySelectorAll('.cs-sp-apply').forEach(function(el) {\r\n      el.addEventListener('click', function() { S.applyExpression(el.dataset.val); });\r\n      el.addEventListener('keydown', function(e) { if (e.key === 'Enter') S.applyExpression(el.dataset.val); });\r\n    });\r\n  },\r\n\r\n  \/* ===== PARSE PART ===== *\/\r\n  parsePart: function(part, min, max) {\r\n    var values = [];\r\n    var p = part.toUpperCase();\r\n    \/* Replace named months\/days *\/\r\n    p = p.replace(\/JAN\/g,'1').replace(\/FEB\/g,'2').replace(\/MAR\/g,'3').replace(\/APR\/g,'4')\r\n         .replace(\/MAY\/g,'5').replace(\/JUN\/g,'6').replace(\/JUL\/g,'7').replace(\/AUG\/g,'8')\r\n         .replace(\/SEP\/g,'9').replace(\/OCT\/g,'10').replace(\/NOV\/g,'11').replace(\/DEC\/g,'12')\r\n         .replace(\/SUN\/g,'0').replace(\/MON\/g,'1').replace(\/TUE\/g,'2').replace(\/WED\/g,'3')\r\n         .replace(\/THU\/g,'4').replace(\/FRI\/g,'5').replace(\/SAT\/g,'6');\r\n    try {\r\n      if (p === '*' || p === '?') {\r\n        for (var i = min; i <= max; i++) values.push(i);\r\n      } else if (p.indexOf('\/') !== -1) {\r\n        var rsParts = p.split('\/');\r\n        var range = rsParts[0], step = parseInt(rsParts[1]);\r\n        var start = min, end = max;\r\n        if (range !== '*' && range !== '?') {\r\n          if (range.indexOf('-') !== -1) {\r\n            var rr = range.split('-'); start = parseInt(rr[0]); end = parseInt(rr[1]);\r\n          } else { start = parseInt(range); }\r\n        }\r\n        for (var j = start; j <= end; j += step) values.push(j);\r\n      } else if (p.indexOf(',') !== -1) {\r\n        var parts = p.split(',');\r\n        for (var k = 0; k < parts.length; k++) {\r\n          if (parts[k].indexOf('-') !== -1) {\r\n            var rr2 = parts[k].split('-');\r\n            for (var r = parseInt(rr2[0]); r <= parseInt(rr2[1]); r++) values.push(r);\r\n          } else { values.push(parseInt(parts[k])); }\r\n        }\r\n      } else if (p.indexOf('-') !== -1) {\r\n        var ab = p.split('-'); for (var m = parseInt(ab[0]); m <= parseInt(ab[1]); m++) values.push(m);\r\n      } else {\r\n        values.push(parseInt(p));\r\n      }\r\n    } catch(e) { return []; }\r\n    return values.filter(function(v) { return !isNaN(v) && v >= min && v <= max; });\r\n  },\r\n\r\n  \/* ===== HUMAN READABLE TRANSLATOR ===== *\/\r\n  humanReadable: function(parts) {\r\n    if (parts.length !== 5) return null;\r\n    var min = parts[0], hr = parts[1], dom = parts[2], mon = parts[3], dow = parts[4];\r\n    var joined = parts.join(' ');\r\n\r\n    \/* Exact matches *\/\r\n    var exact = {\r\n      '* * * * *': 'Every minute',\r\n      '*\/1 * * * *': 'Every minute',\r\n      '0 * * * *': 'Every hour, on the hour',\r\n      '0 0 * * *': 'Every day at midnight (12:00 AM)',\r\n      '0 12 * * *': 'Every day at noon (12:00 PM)',\r\n      '0 0 * * 0': 'Every Sunday at midnight',\r\n      '0 0 1 * *': 'At midnight on the 1st of every month',\r\n      '0 0 1 1 *': 'At midnight on January 1st (yearly)',\r\n      '0 0 * * 1': 'Every Monday at midnight',\r\n      '0 9 * * 1-5': 'Weekdays (Mon\u2013Fri) at 9:00 AM',\r\n      '0 17 * * 1-5': 'Weekdays (Mon\u2013Fri) at 5:00 PM'\r\n    };\r\n    if (exact[joined]) return exact[joined];\r\n\r\n    var out = '';\r\n\r\n    \/* Minute part *\/\r\n    if (min === '*') out += 'Every minute';\r\n    else if (min.indexOf('*\/') === 0) out += 'Every ' + min.slice(2) + ' minutes';\r\n    else if (min.indexOf(',') !== -1) out += 'At minutes ' + min;\r\n    else if (min.indexOf('-') !== -1) out += 'At minutes ' + min.replace('-', ' to ');\r\n    else out += 'At minute ' + min;\r\n\r\n    \/* Hour part *\/\r\n    if (hr !== '*') {\r\n      if (hr.indexOf('*\/') === 0) out += ' of every ' + hr.slice(2) + ' hours';\r\n      else if (hr.indexOf(',') !== -1) out += ', at hours ' + hr;\r\n      else if (hr.indexOf('-') !== -1) out += ', between ' + this.fmtHour(parseInt(hr.split('-')[0])) + ' and ' + this.fmtHour(parseInt(hr.split('-')[1]));\r\n      else if (min.indexOf('*') === -1 && hr.indexOf('\/') === -1) {\r\n        out = 'At ' + this.fmtHour(parseInt(hr)) + ':' + (parseInt(min) < 10 ? '0' + parseInt(min) : String(parseInt(min)));\r\n      } else { out += ' past hour ' + hr; }\r\n    }\r\n\r\n    \/* DOM *\/\r\n    if (dom !== '*' && dom !== '?') {\r\n      if (dom.indexOf('*\/') === 0) out += ', every ' + dom.slice(2) + ' days';\r\n      else if (dom.indexOf(',') !== -1) out += ', on days ' + dom + ' of the month';\r\n      else if (dom.indexOf('-') !== -1) out += ', on days ' + dom.replace('-', '\u2013') + ' of the month';\r\n      else out += ', on the ' + this.ordinal(parseInt(dom)) + ' of the month';\r\n    }\r\n\r\n    \/* Month *\/\r\n    if (mon !== '*' && mon !== '?') {\r\n      if (mon.indexOf(',') !== -1) {\r\n        var mNums = mon.split(',');\r\n        var mNames = mNums.map(function(n) { return MONTHS[parseInt(n)-1] || n; });\r\n        out += ', in ' + mNames.join(', ');\r\n      } else if (mon.indexOf('-') !== -1) {\r\n        var mAB = mon.split('-');\r\n        out += ', from ' + (MONTHS[parseInt(mAB[0])-1] || mAB[0]) + ' to ' + (MONTHS[parseInt(mAB[1])-1] || mAB[1]);\r\n      } else { out += ', in ' + (MONTHS[parseInt(mon)-1] || mon); }\r\n    }\r\n\r\n    \/* DOW *\/\r\n    if (dow !== '*' && dow !== '?') {\r\n      if (dow === '1-5') out += ', weekdays only (Mon\u2013Fri)';\r\n      else if (dow === '0,6' || dow === '6,0') out += ', weekends only (Sat & Sun)';\r\n      else if (dow.indexOf(',') !== -1) {\r\n        var dNums = dow.split(',');\r\n        var dNames = dNums.map(function(n) { return DAYS[parseInt(n)] || n; });\r\n        out += ', on ' + dNames.join(' & ');\r\n      } else if (dow.indexOf('-') !== -1) {\r\n        var dAB = dow.split('-');\r\n        out += ', ' + (DAYS[parseInt(dAB[0])] || dAB[0]) + ' to ' + (DAYS[parseInt(dAB[1])] || dAB[1]);\r\n      } else { out += ', on ' + (DAYS[parseInt(dow)] || dow + 's'); }\r\n    }\r\n\r\n    return out.charAt(0).toUpperCase() + out.slice(1);\r\n  },\r\n\r\n  fmtHour: function(h) {\r\n    if (isNaN(h)) return '?';\r\n    var ampm = h >= 12 ? 'PM' : 'AM';\r\n    var hh = h % 12; hh = hh ? hh : 12;\r\n    return hh + ':00 ' + ampm;\r\n  },\r\n\r\n  ordinal: function(n) {\r\n    var s = ['th','st','nd','rd'];\r\n    var v = n % 100;\r\n    return n + (s[(v-20)%10] || s[v] || s[0]);\r\n  },\r\n\r\n  \/* ===== NEXT RUNS CALCULATOR ===== *\/\r\n  getNextRuns: function(parts, count) {\r\n    var mins   = this.parsePart(parts[0], 0, 59);\r\n    var hours  = this.parsePart(parts[1], 0, 23);\r\n    var doms   = this.parsePart(parts[2], 1, 31);\r\n    var months = this.parsePart(parts[3], 1, 12);\r\n    var dows   = this.parsePart(parts[4], 0, 6);\r\n\r\n    if (!mins.length || !hours.length || !doms.length || !months.length || !dows.length) {\r\n      throw new Error('Invalid field values');\r\n    }\r\n\r\n    var runs = [];\r\n    var d = new Date();\r\n    d.setSeconds(0, 0);\r\n    d.setMinutes(d.getMinutes() + 1);\r\n\r\n    var maxIter = 366 * 24 * 60 * 2;\r\n    var iter = 0;\r\n    var domR = parts[2] !== '*' && parts[2] !== '?';\r\n    var dowR = parts[4] !== '*' && parts[4] !== '?';\r\n\r\n    while (runs.length < count && iter < maxIter) {\r\n      var mo = d.getMonth() + 1;\r\n      var dt = d.getDate();\r\n      var dw = d.getDay();\r\n      var hh = d.getHours();\r\n      var mm = d.getMinutes();\r\n\r\n      var dayMatch;\r\n      if (domR && dowR) { dayMatch = doms.indexOf(dt) !== -1 || dows.indexOf(dw) !== -1; }\r\n      else { dayMatch = doms.indexOf(dt) !== -1 && dows.indexOf(dw) !== -1; }\r\n\r\n      if (months.indexOf(mo) !== -1 && dayMatch && hours.indexOf(hh) !== -1 && mins.indexOf(mm) !== -1) {\r\n        runs.push(new Date(d));\r\n      }\r\n      if (months.indexOf(mo) === -1) { d.setMonth(d.getMonth()+1, 1); d.setHours(0,0,0); }\r\n      else if (!dayMatch) { d.setDate(d.getDate()+1); d.setHours(0,0,0); }\r\n      else if (hours.indexOf(hh) === -1) { d.setHours(d.getHours()+1, 0, 0); }\r\n      else { d.setMinutes(d.getMinutes()+1); }\r\n      iter++;\r\n    }\r\n    return runs;\r\n  },\r\n\r\n  relTime: function(date) {\r\n    var diff = date - new Date();\r\n    var mins = Math.round(diff \/ 60000);\r\n    if (mins < 60) return 'in ' + mins + ' min' + (mins !== 1 ? 's' : '');\r\n    var hrs = Math.round(mins \/ 60);\r\n    if (hrs < 24) return 'in ' + hrs + ' hr' + (hrs !== 1 ? 's' : '');\r\n    var days = Math.round(hrs \/ 24);\r\n    if (days < 30) return 'in ' + days + ' day' + (days !== 1 ? 's' : '');\r\n    var wks = Math.round(days \/ 7);\r\n    if (wks < 8) return 'in ' + wks + ' wk' + (wks !== 1 ? 's' : '');\r\n    var mos = Math.round(days \/ 30);\r\n    return 'in ~' + mos + ' mo';\r\n  },\r\n\r\n  \/* ===== MAIN PROCESS ===== *\/\r\n  processCron: function() {\r\n    var inp = document.getElementById('pth-cron-input');\r\n    var humanEl = document.getElementById('pth-cron-human');\r\n    var runsEl = document.getElementById('pth-cron-runs');\r\n    var badge = document.getElementById('pth-cron-runbadge');\r\n    var diffEl = document.getElementById('pth-cron-diff');\r\n    if (!inp || !humanEl || !runsEl) return;\r\n\r\n    var val = inp.value.trim().replace(\/\\s+\/g,' ');\r\n    var parts = val.split(' ');\r\n\r\n    \/* Update segments *\/\r\n    for (var i = 0; i < 5; i++) {\r\n      var sv = document.getElementById('pth-sv-' + i);\r\n      var sb = document.getElementById('pth-seg-' + i);\r\n      if (sv) sv.textContent = parts[i] || '\u2014';\r\n      if (sb) {\r\n        sb.style.opacity = parts[i] ? '1' : '0.4';\r\n        sb.classList.remove('active');\r\n      }\r\n    }\r\n\r\n    if (parts.length !== 5) {\r\n      inp.className = 'cs-cron-input invalid';\r\n      humanEl.textContent = '\u26a0\ufe0f Enter exactly 5 fields separated by spaces';\r\n      humanEl.className = 'cs-human err';\r\n      runsEl.innerHTML = '<li><span class=\"cs-run-time\">Invalid expression<\/span><\/li>';\r\n      if (badge) badge.textContent = '\u2014 \/ \u2014';\r\n      this.updateAnalyser(null, parts);\r\n      return;\r\n    }\r\n\r\n    try {\r\n      var human = this.humanReadable(parts);\r\n      humanEl.textContent = '\u2705 ' + (human || 'Valid cron expression');\r\n      humanEl.className = 'cs-human';\r\n      inp.className = 'cs-cron-input valid';\r\n    } catch(e) {\r\n      humanEl.textContent = '\u26a0\ufe0f Could not parse expression';\r\n      humanEl.className = 'cs-human warn';\r\n      inp.className = 'cs-cron-input invalid';\r\n    }\r\n\r\n    try {\r\n      var count = parseInt(document.getElementById('pth-cron-runcount').value) || 10;\r\n      var runs = this.getNextRuns(parts, count);\r\n      var tzSel = document.getElementById('pth-cron-tz');\r\n      var tz = tzSel ? tzSel.value : 'local';\r\n\r\n      if (runs.length === 0) {\r\n        runsEl.innerHTML = '<li><span class=\"cs-run-time\">No future executions found<\/span><\/li>';\r\n        if (badge) badge.textContent = '0 runs';\r\n      } else {\r\n        var html = '';\r\n        for (var r = 0; r < runs.length; r++) {\r\n          var d = runs[r];\r\n          var dateStr, timeStr;\r\n          if (tz === 'local' || tz === 'UTC') {\r\n            var opts = {weekday:'short', year:'numeric', month:'short', day:'numeric'};\r\n            var tOpts = {hour:'2-digit', minute:'2-digit', hour12:true};\r\n            if (tz === 'UTC') { opts.timeZone = 'UTC'; tOpts.timeZone = 'UTC'; }\r\n            dateStr = d.toLocaleDateString(undefined, opts);\r\n            timeStr = d.toLocaleTimeString(undefined, tOpts);\r\n          } else {\r\n            try {\r\n              dateStr = d.toLocaleDateString('en-US', {weekday:'short',year:'numeric',month:'short',day:'numeric',timeZone:tz});\r\n              timeStr = d.toLocaleTimeString('en-US', {hour:'2-digit',minute:'2-digit',hour12:true,timeZone:tz});\r\n            } catch(tzErr) {\r\n              dateStr = d.toLocaleDateString();\r\n              timeStr = d.toLocaleTimeString();\r\n            }\r\n          }\r\n          var rel = this.relTime(d);\r\n          html += '<li><span class=\"cs-run-time\">' + this.esc(dateStr) + ' ' + this.esc(timeStr) + '<\/span><span class=\"cs-run-rel\">' + this.esc(rel) + '<\/span><\/li>';\r\n        }\r\n        runsEl.innerHTML = html;\r\n        if (badge) badge.textContent = runs.length + ' runs';\r\n\r\n        \/* Show diff between first and second run *\/\r\n        if (runs.length >= 2 && diffEl) {\r\n          var diffMs = runs[1] - runs[0];\r\n          var diffMins = Math.round(diffMs \/ 60000);\r\n          var diffStr = '';\r\n          if (diffMins < 60) diffStr = 'Interval: every ' + diffMins + ' minute' + (diffMins !== 1 ? 's' : '');\r\n          else if (diffMins < 1440) diffStr = 'Interval: every ' + Math.round(diffMins\/60) + ' hour' + (Math.round(diffMins\/60) !== 1 ? 's' : '');\r\n          else diffStr = 'Interval: every ~' + Math.round(diffMins\/1440) + ' day' + (Math.round(diffMins\/1440) !== 1 ? 's' : '');\r\n          diffEl.textContent = diffStr;\r\n        } else if (diffEl) { diffEl.textContent = ''; }\r\n      }\r\n    } catch(e) {\r\n      runsEl.innerHTML = '<li><span class=\"cs-run-time\" style=\"color:#991b1b;\">\u26a0\ufe0f ' + this.esc(e.message || 'Parse error') + '<\/span><\/li>';\r\n      if (badge) badge.textContent = 'Error';\r\n    }\r\n\r\n    this.updateAnalyser(parts, null);\r\n  },\r\n\r\n  \/* ===== EXPRESSION ANALYSER (sidebar) ===== *\/\r\n  updateAnalyser: function(parts, rawParts) {\r\n    var el = document.getElementById('pth-cron-analyser');\r\n    if (!el) return;\r\n    if (!parts) { el.innerHTML = '<div style=\"font-size:12px;color:#475569;\">Invalid expression<\/div>'; return; }\r\n\r\n    var labels = ['Minute','Hour','Day (Mo)','Month','Day (Wk)'];\r\n    var ranges = ['0\u201359','0\u201323','1\u201331','1\u201312','0\u20136'];\r\n    var html = '';\r\n    for (var i = 0; i < 5; i++) {\r\n      var p = parts[i];\r\n      var desc = '';\r\n      if (p === '*') desc = '<span style=\"color:#059669;font-weight:700;\">Any<\/span>';\r\n      else if (p.indexOf('*\/') === 0) desc = '<span style=\"color:#2563eb;font-weight:700;\">Every ' + p.slice(2) + '<\/span>';\r\n      else if (p.indexOf(',') !== -1) desc = '<span style=\"color:#7c3aed;font-weight:700;\">List: ' + p + '<\/span>';\r\n      else if (p.indexOf('-') !== -1) desc = '<span style=\"color:#c2410c;font-weight:700;\">Range: ' + p + '<\/span>';\r\n      else desc = '<span style=\"color:#0f172a;font-weight:700;\">= ' + p + '<\/span>';\r\n\r\n      html += '<div style=\"display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid #f1f5f9;\">';\r\n      html += '<span style=\"font-size:11px;font-weight:700;color:#334155;\">' + labels[i] + '<\/span>';\r\n      html += '<span style=\"font-family:monospace;font-size:11px;background:#f8fafc;padding:2px 6px;border-radius:4px;\">' + this.esc(p) + '<\/span>';\r\n      html += '<\/div>';\r\n      html += '<div style=\"font-size:10px;margin-bottom:4px;padding:2px 0;\">' + desc + ' <span style=\"color:#94a3b8;font-size:10px;\">(' + ranges[i] + ')<\/span><\/div>';\r\n    }\r\n    el.innerHTML = html;\r\n  },\r\n\r\n  \/* ===== PRESETS ===== *\/\r\n  buildPresets: function(cat, search) {\r\n    var grid = document.getElementById('pth-preset-grid');\r\n    if (!grid) return;\r\n    var S = this;\r\n    var q = (search || '').toLowerCase();\r\n    var filtered = PRESETS.filter(function(p) {\r\n      var matchCat = cat === 'all' || p.cat === cat;\r\n      var matchQ = !q || p.name.toLowerCase().indexOf(q) !== -1 || p.desc.toLowerCase().indexOf(q) !== -1 || p.code.toLowerCase().indexOf(q) !== -1;\r\n      return matchCat && matchQ;\r\n    });\r\n\r\n    var catColors = {common:'#2563eb',backup:'#7c3aed',web:'#0891b2',report:'#047857',system:'#c2410c'};\r\n    var catBg    = {common:'#eff6ff',backup:'#f5f3ff',web:'#ecfeff',report:'#f0fdf4',system:'#fff7ed'};\r\n\r\n    if (filtered.length === 0) {\r\n      grid.innerHTML = '<div style=\"grid-column:1\/-1;text-align:center;padding:24px;color:#64748b;font-size:13px;\">No presets match. Try a different search.<\/div>';\r\n      return;\r\n    }\r\n\r\n    var html = '';\r\n    for (var i = 0; i < filtered.length; i++) {\r\n      var p = filtered[i];\r\n      var cc = catColors[p.cat] || '#334155';\r\n      var cb = catBg[p.cat] || '#f8fafc';\r\n      html += '<div class=\"cs-preset-card\" data-code=\"' + p.code + '\" role=\"button\" tabindex=\"0\" aria-label=\"Use preset: ' + p.name + '\">';\r\n      html += '<div class=\"cs-preset-name\">' + this.esc(p.name) + '<\/div>';\r\n      html += '<div class=\"cs-preset-code\">' + this.esc(p.code) + '<\/div>';\r\n      html += '<div class=\"cs-preset-desc\">' + this.esc(p.desc) + '<\/div>';\r\n      html += '<span class=\"cs-preset-cat-tag\" style=\"background:' + cb + ';color:' + cc + ';\">' + p.cat + '<\/span>';\r\n      html += '<\/div>';\r\n    }\r\n    grid.innerHTML = html;\r\n\r\n    \/* Attach events *\/\r\n    grid.querySelectorAll('.cs-preset-card').forEach(function(card) {\r\n      card.addEventListener('click', function() { S.applyExpression(card.dataset.code); });\r\n      card.addEventListener('keydown', function(e) { if (e.key === 'Enter') S.applyExpression(card.dataset.code); });\r\n    });\r\n  },\r\n\r\n  applyExpression: function(code) {\r\n    var inp = document.getElementById('pth-cron-input');\r\n    if (inp) { inp.value = code; this.processCron(); this.switchTab('builder'); this.toast('\u2705 Applied: ' + code, 'success'); }\r\n  },\r\n\r\n  \/* ===== VISUAL BUILDER ===== *\/\r\n  setVbMode: function(mode) {\r\n    this.vbMode = mode;\r\n    var btns = document.querySelectorAll('.cs-vb-mode');\r\n    btns.forEach(function(b) { b.classList.toggle('on', b.dataset.mode === mode); });\r\n    var sections = {interval:'pth-vb-interval',daily:'pth-vb-daily',weekly:'pth-vb-weekly',monthly:'pth-vb-monthly',advanced:'pth-vb-advanced'};\r\n    Object.keys(sections).forEach(function(k) {\r\n      var el = document.getElementById(sections[k]);\r\n      if (el) el.classList.toggle('on', k === mode);\r\n    });\r\n    this.updateVbPreview();\r\n  },\r\n\r\n  buildDomGrid: function() {\r\n    var grid = document.getElementById('pth-vb-dom');\r\n    if (!grid) return;\r\n    var S = this;\r\n    var html = '';\r\n    for (var i = 1; i <= 31; i++) {\r\n      html += '<button type=\"button\" class=\"cs-dom-btn' + (i === 1 ? ' on' : '') + '\" data-dom=\"' + i + '\" aria-label=\"Day ' + i + '\" aria-pressed=\"' + (i === 1 ? 'true' : 'false') + '\">' + i + '<\/button>';\r\n    }\r\n    grid.innerHTML = html;\r\n    grid.querySelectorAll('.cs-dom-btn').forEach(function(btn) {\r\n      btn.addEventListener('click', function() {\r\n        btn.classList.toggle('on');\r\n        btn.setAttribute('aria-pressed', btn.classList.contains('on') ? 'true' : 'false');\r\n        S.updateVbPreview();\r\n      });\r\n    });\r\n  },\r\n\r\n  updateVbPreview: function() {\r\n    var preview = document.getElementById('pth-vb-preview');\r\n    if (!preview) return;\r\n    var cron = this.generateVbCron();\r\n    preview.textContent = cron;\r\n  },\r\n\r\n  generateVbCron: function() {\r\n    var mode = this.vbMode;\r\n    var val = function(id) { var el = document.getElementById(id); return el ? el.value : '0'; };\r\n\r\n    if (mode === 'interval') {\r\n      var n = parseInt(val('pth-vb-int-val')) || 5;\r\n      var unit = val('pth-vb-int-unit');\r\n      if (unit === 'minute') return '*\/' + n + ' * * * *';\r\n      else return '0 *\/' + n + ' * * *';\r\n    }\r\n    if (mode === 'daily') {\r\n      var h = parseInt(val('pth-vb-d-h')) || 0;\r\n      var m = parseInt(val('pth-vb-d-m')) || 0;\r\n      return m + ' ' + h + ' * * *';\r\n    }\r\n    if (mode === 'weekly') {\r\n      var h2 = parseInt(val('pth-vb-w-h')) || 9;\r\n      var m2 = parseInt(val('pth-vb-w-m')) || 0;\r\n      var dows = [];\r\n      document.querySelectorAll('#pth-vb-dow .cs-dow-btn.on').forEach(function(b) { dows.push(b.dataset.dow); });\r\n      var dowStr = dows.length === 7 ? '*' : (dows.length === 0 ? '*' : dows.join(','));\r\n      \/* Try to compress consecutive to range *\/\r\n      if (dows.length > 2) {\r\n        var nums = dows.map(Number).sort(function(a,b){return a-b;});\r\n        var isConsec = true;\r\n        for (var i = 1; i < nums.length; i++) { if (nums[i] !== nums[i-1]+1) { isConsec=false; break; } }\r\n        if (isConsec && nums.length > 2) dowStr = nums[0] + '-' + nums[nums.length-1];\r\n      }\r\n      return m2 + ' ' + h2 + ' * * ' + dowStr;\r\n    }\r\n    if (mode === 'monthly') {\r\n      var h3 = parseInt(val('pth-vb-mo-h')) || 0;\r\n      var m3 = parseInt(val('pth-vb-mo-m')) || 0;\r\n      var monStr = val('pth-vb-mo-mon') || '*';\r\n      var doms = [];\r\n      document.querySelectorAll('#pth-vb-dom .cs-dom-btn.on').forEach(function(b) { doms.push(b.dataset.dom); });\r\n      var domStr = doms.length === 0 ? '1' : doms.join(',');\r\n      return m3 + ' ' + h3 + ' ' + domStr + ' ' + monStr + ' *';\r\n    }\r\n    if (mode === 'advanced') {\r\n      return (val('pth-adv-min') || '*') + ' ' + (val('pth-adv-hr') || '*') + ' ' + (val('pth-adv-dom') || '*') + ' ' + (val('pth-adv-mon') || '*') + ' ' + (val('pth-adv-dow') || '*');\r\n    }\r\n    return '* * * * *';\r\n  },\r\n\r\n  applyAdvanced: function() {\r\n    var cron = this.generateVbCron();\r\n    var preview = document.getElementById('pth-vb-preview');\r\n    if (preview) preview.textContent = cron;\r\n  },\r\n\r\n  resetVb: function() {\r\n    this.setVbMode('interval');\r\n    var vbIntV = document.getElementById('pth-vb-int-val');\r\n    if (vbIntV) vbIntV.value = '5';\r\n    var vbIntU = document.getElementById('pth-vb-int-unit');\r\n    if (vbIntU) vbIntU.value = 'minute';\r\n    this.updateVbPreview();\r\n    this.toast('\u21a9\ufe0f Builder reset', 'info');\r\n  },\r\n\r\n  \/* ===== SAMPLE + CLEAR ===== *\/\r\n  loadSample: function() {\r\n    var inp = document.getElementById('pth-cron-input');\r\n    var samples = ['0 9 * * 1-5','*\/5 * * * *','0 0 1 * *','0 3 * * 0','0 12 * * *'];\r\n    var pick = samples[Math.floor(Math.random() * samples.length)];\r\n    if (inp) { inp.value = pick; this.processCron(); this.toast('\ud83d\udca1 Sample: ' + pick, 'info'); }\r\n  },\r\n\r\n  clearAll: function() {\r\n    var inp = document.getElementById('pth-cron-input');\r\n    if (inp) { inp.value = '* * * * *'; this.processCron(); this.toast('\ud83d\uddd1\ufe0f Reset to wildcard', 'info'); }\r\n  }\r\n};\r\n\r\n\/* ===== 4-LAYER BOOTSTRAP ===== *\/\r\nfunction runInit() {\r\n  if (!window.pthCronApp.initialized && document.getElementById('pth-cron-wrap')) {\r\n    window.pthCronApp.initialized = true;\r\n    window.pthCronApp.init();\r\n  }\r\n}\r\nrunInit();\r\nif (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runInit); }\r\nwindow.addEventListener('load', function() { setTimeout(runInit, 50); });\r\nif (!window.pthCronApp.initialized && typeof MutationObserver !== 'undefined') {\r\n  var pthCronObs = new MutationObserver(function() {\r\n    if (document.getElementById('pth-cron-wrap')) { pthCronObs.disconnect(); runInit(); }\r\n  });\r\n  pthCronObs.observe(document.body || document.documentElement, {childList:true,subtree:true});\r\n  setTimeout(function() { pthCronObs.disconnect(); }, 10000);\r\n}\r\n\r\n})();\r\n<\/script>\n\n\n\n<style>\n.pth-feature-wrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:32px}\n.pth-feat-box{border:1px solid #e2e8f0;background:#fff;padding:24px;border-radius:12px;box-shadow:0 4px 6px -1px rgba(0,0,0,0.03);transition:all .25s ease}\n.pth-feat-box:hover{border-color:#bfdbfe;transform:translateY(-3px);box-shadow:0 10px 20px -5px rgba(37,99,235,0.08)}\n.pth-feat-title{font-size:1.05rem;font-weight:800;color:#0f172a;margin-bottom:10px;display:flex;align-items:center;gap:10px}\n.pth-feat-text{font-size:.9rem;color:#1e293b;line-height:1.65;margin:0;font-weight:500}\n.pth-steps-wrap{border:1px solid #e2e8f0;background:#fff;padding:40px 30px;border-radius:16px;text-align:center;box-shadow:0 4px 6px -1px rgba(0,0,0,0.03);margin-bottom:40px}\n.pth-steps-title{font-size:1.15rem;font-weight:800;color:#0f172a;text-transform:uppercase;margin-bottom:36px;letter-spacing:1px}\n.pth-steps-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:28px}\n.pth-step-item{display:flex;flex-direction:column;align-items:center}\n.pth-step-num{width:46px;height:46px;background:#2563eb;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1.2rem;margin-bottom:14px;box-shadow:0 4px 12px rgba(37,99,235,.3)}\n.pth-step-name{font-weight:800;color:#0f172a;margin-bottom:8px;font-size:1rem}\n.pth-step-desc{font-size:.88rem;color:#1e293b;line-height:1.55;margin:0;font-weight:500}\n@media(max-width:600px){.pth-steps-wrap{padding:24px 16px}}\n<\/style>\n\n<div class=\"pth-feature-wrap\">\n  <div class=\"pth-feat-box\">\n    <div class=\"pth-feat-title\">\ud83d\udfe2 4-Tab All-in-One Studio<\/div>\n    <p class=\"pth-feat-text\">Next Runs, Presets Library, Visual Builder and Reference tabs work together in one tool. Type an expression, see it explained in plain English, calculate the next 10 executions in your timezone, and copy to clipboard \u2014 without leaving the page.<\/p>\n  <\/div>\n  <div class=\"pth-feat-box\">\n    <div class=\"pth-feat-title\">\ud83d\udd35 Visual Builder \u2014 No Syntax Required<\/div>\n    <p class=\"pth-feat-text\">Build cron expressions by clicking \u2014 not typing. Five build modes: Interval (every N minutes or hours), Daily (pick exact time), Weekly (checkbox grid for days), Monthly (calendar grid for dates), and Advanced (field-by-field inputs). Generated expression updates live.<\/p>\n  <\/div>\n  <div class=\"pth-feat-box\">\n    <div class=\"pth-feat-title\">\ud83d\udfe3 30+ Presets + Timezone Next Runs<\/div>\n    <p class=\"pth-feat-text\">Searchable library of 30 categorized presets \u2014 Backups, Web Maintenance, Reports, System tasks and Common patterns. Next executions display in 15 timezones including UTC, US, Europe, Asia and Sri Lanka, with relative time badges showing &#8220;in 2 hrs&#8221; or &#8220;in 3 days&#8221;.<\/p>\n  <\/div>\n<\/div>\n\n<div class=\"pth-steps-wrap\">\n  <div class=\"pth-steps-title\">How to Generate a Cron Expression<\/div>\n  <div class=\"pth-steps-grid\">\n    <div class=\"pth-step-item\">\n      <div class=\"pth-step-num\">1<\/div>\n      <div class=\"pth-step-name\">Type or Pick<\/div>\n      <p class=\"pth-step-desc\">Type a cron expression directly into the main input box, or click \ud83d\udca1 Load Sample to start with a working example. The 5 segment boxes update instantly to show each field.<\/p>\n    <\/div>\n    <div class=\"pth-step-item\">\n      <div class=\"pth-step-num\">2<\/div>\n      <div class=\"pth-step-name\">Read the Translation<\/div>\n      <p class=\"pth-step-desc\">The green bar below the input shows the plain-English meaning \u2014 &#8220;Weekdays (Mon\u2013Fri) at 9:00 AM&#8221; or &#8220;Every 15 minutes&#8221;. If the expression is invalid, you see exactly what&#8217;s wrong.<\/p>\n    <\/div>\n    <div class=\"pth-step-item\">\n      <div class=\"pth-step-num\">3<\/div>\n      <div class=\"pth-step-name\">Check Next Runs<\/div>\n      <p class=\"pth-step-desc\">Switch to the \ud83d\udcc5 Next Runs tab. Select your timezone and how many runs to show. See the upcoming 5, 10 or 20 execution times with relative time labels like &#8220;in 4 hours&#8221;.<\/p>\n    <\/div>\n    <div class=\"pth-step-item\">\n      <div class=\"pth-step-num\">4<\/div>\n      <div class=\"pth-step-name\">Copy and Deploy<\/div>\n      <p class=\"pth-step-desc\">Click \ud83d\udccb Copy to put the verified expression on your clipboard. Paste it into your server crontab, GitHub Actions schedule, AWS EventBridge rule or any cron-compatible system.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Last updated: July 2025<\/p>\n\n\n\n<h2 id=\"\ud83d\udd34-what-a-cron-expression-actually-does-and-why-getting-it-wrong-is-costly\" class=\"wp-block-heading\">\ud83d\udd34 <strong>What a Cron Expression Actually Does \u2014 and Why Getting It Wrong Is Costly<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A cron expression is a schedule. Five fields, separated by spaces, that tell a Unix-based scheduler exactly when to fire a task. Get the expression right and your backup runs silently every Sunday at 3 AM for years. Get it wrong and either it never runs, runs every minute flooding your database, or fires at 3 PM instead of 3 AM \u2014 and you don&#8217;t find out until something breaks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The classic problem with cron syntax is that it looks deceptively simple. Five characters like <code>0 3 * * 0<\/code> pack a precise meaning \u2014 &#8220;at 3:00 AM every Sunday&#8221; \u2014 but the minute you introduce a step value or a range, or you&#8217;re working across timezones, or you&#8217;re writing for AWS EventBridge instead of Linux crontab, the rules shift. A cron expression generator that shows you the next actual run times removes the guesswork entirely.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe1-the-five-fields-what-each-position-controls\" class=\"wp-block-heading\">\ud83d\udfe1 <strong>The Five Fields \u2014 What Each Position Controls<\/strong><\/h2>\n\n\n<figure class=\"pth-article-figure pth-img-left\" style=\"float:left; width:700px; max-width:100%; margin:4px 28px 16px 0; clear:left;\"><img decoding=\"async\" src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/07\/cron-expression-breakdown-800x447.jpeg\" alt=\"Diagram breaking down a cron expression into 5 labeled fields: minute, hour, day, month, day of week\" width=\"700\" height=\"394\" loading=\"lazy\" data-no-lazy=\"1\" class=\"pth-article-img\" style=\"width:100%;height:auto;display:block;border-radius:10px;border:1px solid #e2e8f0;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Reading left to right: Minute (0\u201359), Hour (0\u201323), Day of Month (1\u201331), Month (1\u201312), Day of Week (0\u20136, where 0 is Sunday). The most common mistake is confusing field order \u2014 especially Day of Month and Month, which swap positions compared to how humans naturally say dates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each field accepts four types of values:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd35 <strong>Wildcard<\/strong> <code>*<\/code> \u2014 match any value. <code>* * * * *<\/code> runs every minute of every hour of every day.<\/li>\n\n\n\n<li>\ud83d\udfe0 <strong>Step<\/strong> <code>*\/5<\/code> \u2014 every 5 units. <code>*\/15 * * * *<\/code> runs at minutes 0, 15, 30, 45 of every hour.<\/li>\n\n\n\n<li>\ud83d\udfe3 <strong>Range<\/strong> <code>1-5<\/code> \u2014 every value from 1 to 5 inclusive. <code>0 9 * * 1-5<\/code> means 9 AM, Monday through Friday.<\/li>\n\n\n\n<li>\ud83d\udd35 <strong>List<\/strong> <code>1,15<\/code> \u2014 specific values. <code>0 0 1,15 * *<\/code> runs at midnight on the 1st and 15th of each month.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can also combine them: <code>0,30 9-17 * * 1-5<\/code> fires at the top and bottom of every hour, between 9 AM and 5 PM, on weekdays. The Expression Analyser sidebar in Cron Studio Pro labels each field type \u2014 Any, Every, List, Range \u2014 so you can see at a glance what each position is doing.<\/p>\n\n\n\n<h3 id=\"\ud83d\udfe2-day-of-month-vs-day-of-week-the-or-logic-trap\" class=\"wp-block-heading\">\ud83d\udfe2 <strong>Day of Month vs Day of Week \u2014 The OR Logic Trap<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When both the Day of Month field and Day of Week field are set to something other than <code>*<\/code>, most cron implementations apply OR logic \u2014 the job runs if either condition is met. <code>0 0 1 * 1<\/code> does not mean &#8220;the first Monday of the month&#8221; \u2014 it means &#8220;midnight on the 1st of every month OR every Monday&#8221;, whichever comes first. This surprises a lot of developers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To get &#8220;first Monday of the month&#8221; you need a script-level check inside the cron job itself \u2014 compare the date and day together in your shell script or application code, then exit early if the condition isn&#8217;t met. AWS EventBridge is the one major platform that enforces AND logic when both fields are set.<\/p>\n\n\n\n<h2 id=\"\ud83d\udd34-30-real-world-cron-patterns-and-when-to-use-each\" class=\"wp-block-heading\">\ud83d\udd34 <strong>30 Real-World Cron Patterns and When to Use Each<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cron Studio Pro&#8217;s preset library organizes 30 patterns into five categories. Here&#8217;s the logic behind each group and when to reach for them.<\/p>\n\n\n\n<h3 id=\"\ud83d\udfe2-backup-schedules-stagger-to-avoid-peak-load\" class=\"wp-block-heading\">\ud83d\udfe2 <strong>Backup Schedules \u2014 Stagger to Avoid Peak Load<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Backups should never run at midnight exactly. Every shared server, cloud VM and managed database cluster has a traffic spike at <code>0 0 * * *<\/code> because every developer uses midnight as the default. Use <code>0 2 * * *<\/code> (2 AM) or <code>0 3 * * 0<\/code> (3 AM Sunday) instead. Stagger different backup types: files at 2 AM, database at 2:30 AM (<code>30 2 * * *<\/code>), and off-site sync at 3 AM. Quarterly backups hit the first day of each quarter: <code>0 0 1 1,4,7,10 *<\/code>.<\/p>\n\n\n\n<h3 id=\"\ud83d\udfe2-web-maintenance-cache-sitemaps-and-ssl\" class=\"wp-block-heading\">\ud83d\udfe2 <strong>Web Maintenance \u2014 Cache, Sitemaps and SSL<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cache-clearing jobs cause a brief performance dip as pages rebuild. Run them during the lowest-traffic window for your audience \u2014 typically 4\u20136 AM local time. <code>0 *\/6 * * *<\/code> clears cache every 6 hours without hammering the server. Sitemap rebuilds only need to run when content changes, so weekly (<code>0 0 * * 0<\/code>) or daily (<code>0 1 * * *<\/code>) is enough for most sites. SSL certificate checks should run daily well before the renewal window \u2014 <code>0 8 * * *<\/code> gives you a morning email if something expired overnight.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress sites using WP-Cron need special treatment. WP-Cron fires on page load, not on a real schedule. For reliable execution, disable it in <code>wp-config.php<\/code> with <code>define('DISABLE_WP_CRON', true);<\/code> and add a real server cron: <code>*\/5 * * * * php \/var\/www\/html\/wp-cron.php<\/code>. This fires WordPress scheduled events every 5 minutes regardless of traffic.<\/p>\n\n\n\n<h3 id=\"\ud83d\udfe2-reporting-jobs-timing-around-business-hours\" class=\"wp-block-heading\">\ud83d\udfe2 <strong>Reporting Jobs \u2014 Timing Around Business Hours<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Daily report emails land best at the start of the business day, not at midnight. <code>0 8 * * *<\/code> or <code>0 9 * * *<\/code> puts the summary in inboxes before the first coffee. Weekly reports work best on Monday morning (<code>0 9 * * 1<\/code>) so teams see last week&#8217;s numbers at the start of the new week. End-of-day summaries at <code>0 17 * * 1-5<\/code> hit inboxes as people wrap up. Monthly reports on the 1st (<code>0 7 1 * *<\/code>) give a few hours before the standup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Always factor in timezone. A cron running on a UTC server at <code>0 9 * * *<\/code> fires at 9 AM UTC \u2014 which is 2:30 PM IST (India\/Sri Lanka) or 4 AM US Eastern. Use the timezone selector in Cron Studio Pro&#8217;s Next Runs tab to verify the actual local time before deploying. Check our <a href=\"https:\/\/schoolict.net\/tools\/free-web-tools-directory-prime-tool-hub\/?cat=developer-tools\">Developer Tools collection<\/a> for related server and scheduling utilities.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe1-platform-differences-why-the-same-expression-fails-on-aws-but-works-on-linux\" class=\"wp-block-heading\">\ud83d\udfe1 <strong>Platform Differences \u2014 Why the Same Expression Fails on AWS but Works on Linux<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The 5-field cron format is not universal. Different platforms extend or modify it in incompatible ways.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Linux crontab<\/strong> is the reference implementation. Five fields, runs as the user&#8217;s own cron table edited via <code>crontab -e<\/code>. The system crontab at <code>\/etc\/cron.d\/<\/code> adds a username field before the command, making it 7 parts total (6 schedule fields + user + command). Special strings like <code>@reboot<\/code> and <code>@daily<\/code> work here.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>AWS EventBridge<\/strong> uses a 6-field format where the 6th field is year: <code>min hr day month dow year<\/code>. It also requires that exactly one of Day of Month or Day of Week is set to <code>?<\/code> \u2014 you cannot use <code>*<\/code> for both. Always runs in UTC. A standard 5-field expression copied from Linux will fail here without modification.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>GitHub Actions<\/strong> accepts the standard 5-field format in the <code>on: schedule: - cron:<\/code> YAML block. Minimum interval is 5 minutes \u2014 shorter intervals simply won&#8217;t trigger. All times are UTC. Heavy load periods like midnight UTC on popular open-source repos sometimes delay jobs by 15\u201330 minutes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cloudflare Workers<\/strong> supports standard 5-field cron via <code>wrangler.toml<\/code> triggers. UTC only. <strong>Kubernetes CronJobs<\/strong> also use standard 5-field, but run in the cluster&#8217;s configured timezone, which defaults to UTC unless explicitly set. <\/p>\n\n\n\n<style>\n.pth-faq-section{margin-top:50px;margin-bottom:40px}\n.pth-faq-header{font-size:1.8rem;font-weight:800;color:#0f172a;margin-bottom:25px;border-bottom:2px solid #e2e8f0;padding-bottom:10px;display:flex;align-items:center;gap:10px}\n.pth-faq-grid{display:grid;grid-template-columns:100%;gap:18px}\n@media(min-width:768px){.pth-faq-grid{grid-template-columns:repeat(2,1fr)}}\n@media(min-width:1024px){.pth-faq-grid{grid-template-columns:repeat(3,1fr)}}\n.pth-faq-card{background:#f8fafc;padding:22px;border-radius:12px;border:1px solid #e2e8f0;transition:transform .2s ease}\n.pth-faq-card:hover{transform:translateY(-3px);box-shadow:0 4px 12px rgba(0,0,0,.05)}\n.pth-faq-q{color:#0f172a;font-size:1rem;font-weight:700;margin:0 0 10px;line-height:1.4}\n.pth-faq-a{margin:0;font-size:.92rem;color:#1e293b;line-height:1.6;font-weight:500}\n<\/style>\n\n<div class=\"pth-faq-section\">\n  <div class=\"pth-faq-header\">\ud83e\udd14 Frequently Asked Questions<\/div>\n  <div class=\"pth-faq-grid\">\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">What does * * * * * mean in a cron expression?<\/p>\n      <p class=\"pth-faq-a\">It means &#8220;every minute&#8221;. Each asterisk is a wildcard matching every possible value for that field \u2014 every minute, every hour, every day of the month, every month, and every day of the week. It&#8217;s the most permissive cron expression possible and fires 1,440 times per day.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">How do I run a cron job every 5 minutes?<\/p>\n      <p class=\"pth-faq-a\">Use <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">*\/5 * * * *<\/code>. The <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">*\/5<\/code> in the minute field means &#8220;every 5 minutes starting from 0&#8221;, so it fires at :00, :05, :10, :15 and so on. Change 5 to any divisor of 60 for consistent intervals: 2, 3, 4, 5, 6, 10, 12, 15, 20, 30.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">Does the cron expression generator work offline?<\/p>\n      <p class=\"pth-faq-a\">Yes. Cron Studio Pro runs 100% in your browser. The next run calculator, human-readable translator, visual builder, preset library and all other features use JavaScript with no server calls. It works without an internet connection once the page has loaded.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">How do I write a cron expression for the first Monday of each month?<\/p>\n      <p class=\"pth-faq-a\">Standard cron can&#8217;t express &#8220;first Monday&#8221; directly \u2014 using both day-of-month and day-of-week applies OR logic, not AND. The reliable approach is to set a Monday cron (<code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">0 9 * * 1<\/code>) and add a script check: only proceed if the date is between 1 and 7. AWS EventBridge supports this natively via its <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">?<\/code> syntax.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">What timezone does cron use?<\/p>\n      <p class=\"pth-faq-a\">Linux crontab uses the system timezone of the server \u2014 which is often UTC on cloud VMs. If your server is UTC and you want a job at 9 AM IST (Sri Lanka), you need to set the minute and hour fields for 3:30 AM UTC, which is <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">30 3 * * *<\/code>. Use the timezone selector in the Next Runs tab to verify before deploying.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">What&#8217;s the difference between cron on Linux and AWS EventBridge?<\/p>\n      <p class=\"pth-faq-a\">AWS EventBridge uses a 6-field format (adds a year field) and requires <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">?<\/code> in either the day-of-month or day-of-week position \u2014 you cannot use <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">*<\/code> for both. Linux crontab uses 5 fields, allows both to be <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">*<\/code>, and supports @special strings. A standard Linux expression needs manual adjustment for EventBridge.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">Why does my cron job seem to run at the wrong time?<\/p>\n      <p class=\"pth-faq-a\">Almost always a timezone mismatch. Cloud servers and containers typically run in UTC. If you write <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">0 9 * * *<\/code> expecting 9 AM local time but the server is UTC and you&#8217;re UTC+5:30 (IST), the job fires at 2:30 PM your time. Always verify next run times in your actual timezone using a cron calculator before deploying to production.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">Can I use names like MON or JAN instead of numbers?<\/p>\n      <p class=\"pth-faq-a\">Yes. Most cron implementations accept three-letter abbreviations for days (SUN, MON, TUE, WED, THU, FRI, SAT) and months (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC). You can use ranges and lists with names too: <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">0 9 * JAN,JUL MON-FRI<\/code> is valid on Linux crontab.<\/p>\n    <\/div>\n\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">What is the minimum cron interval on GitHub Actions?<\/p>\n      <p class=\"pth-faq-a\">GitHub Actions enforces a minimum schedule interval of 5 minutes \u2014 the shortest valid expression is <code style=\"background:#f1f5f9;padding:2px 5px;border-radius:3px;\">*\/5 * * * *<\/code>. Additionally, scheduled workflows on popular repositories may be delayed by 15\u201330 minutes during high-load periods. GitHub Actions always runs in UTC regardless of repository settings.<\/p>\n    <\/div>\n\n  <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Cron Studio Pro Generate, parse, and test Cron job expressions offline. Instantly translate complex crontab schedules into human-readable text and view upcoming execution dates. now use Cron Job Generator &amp; Parser. \ud83d\udfe2 4-Tab All-in-One Studio Next Runs, Presets Library, Visual Builder and Reference tabs work together in one tool. Type an expression, see it explained &#8230; <a title=\"Cron Job Generator &amp; Parser\" class=\"read-more\" href=\"https:\/\/schoolict.net\/tools\/cron-job-generator\/\" aria-label=\"Read more about Cron Job Generator &amp; Parser\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":6624,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-739","page","type-page","status-publish","has-post-thumbnail"],"_links":{"self":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/comments?post=739"}],"version-history":[{"count":8,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/739\/revisions"}],"predecessor-version":[{"id":6630,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/739\/revisions\/6630"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media\/6624"}],"wp:attachment":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media?parent=739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}