<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>計算0123456789</title>
	<atom:link href="https://0123456789.tw/feed/" rel="self" type="application/rss+xml"/>
	<link>https://0123456789.tw</link>
	<description></description>
	<lastBuildDate>Thu, 15 Oct 2026 12:08:44 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<itunes:explicit>no</itunes:explicit><itunes:image href="http://en.gravatar.com/userimage/7521775/c9d0938851e6c18316c4dfa3dd2270b7.png"/><itunes:keywords>計算0123456789</itunes:keywords><itunes:summary>計算0123456789</itunes:summary><itunes:subtitle>0123456789.tw</itunes:subtitle><itunes:owner><itunes:email>t0918013013@gmail.com</itunes:email></itunes:owner><item>
		<title>心智圖產生器(線上編修)</title>
		<link>https://0123456789.tw/mindmap/</link>
		
		
		<pubDate>Thu, 15 Oct 2026 12:08:44 +0000</pubDate>
				<category><![CDATA[計算blog文]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2259</guid>

					<description/>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://0123456789.tw/mindmap/"><img fetchpriority="high" decoding="async" width="867" height="867" src="https://0123456789.tw/wp-content/uploads/2026/10/Screenshot-2026-10-15-at-20-05-31.jpg" alt="" class="wp-image-2262" srcset="https://0123456789.tw/wp-content/uploads/2026/10/Screenshot-2026-10-15-at-20-05-31.jpg 867w, https://0123456789.tw/wp-content/uploads/2026/10/Screenshot-2026-10-15-at-20-05-31-768x768.jpg 768w, https://0123456789.tw/wp-content/uploads/2026/10/Screenshot-2026-10-15-at-20-05-31-150x150.jpg 150w, https://0123456789.tw/wp-content/uploads/2026/10/Screenshot-2026-10-15-at-20-05-31-300x300.jpg 300w" sizes="(max-width: 867px) 100vw, 867px" /></a></figure>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>計畫執行與實際執行計時器</title>
		<link>https://0123456789.tw/plantimer/</link>
		
		
		<pubDate>Tue, 13 Oct 2026 08:43:18 +0000</pubDate>
				<category><![CDATA[計算blog文]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2256</guid>

					<description><![CDATA[這件事做了多久｜計時與預計時間比較工具 &#8211; 計算Pro 這件事做了多久 設定預計時間 → 按下開始 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>這件事做了多久｜計時與預計時間比較工具 &#8211; 計算Pro</title>
<meta name="description" content="記錄一件事實際花了多久：設定預計花費時間，按下開始與結束，自動計算比預計多了或少了多久，並附獨立計時器（開始、暫停、停止，含按鈕音效）。資料只存在本機，免註冊。">
<link rel="canonical" href="https://0123456789.tw/howlong/">
<link rel="alternate" hreflang="zh-TW" href="https://0123456789.tw/howlong/">
<link rel="alternate" hreflang="x-default" href="https://0123456789.tw/howlong/">
<meta property="og:type" content="website">
<meta property="og:title" content="這件事做了多久｜計時與預計時間比較工具">
<meta property="og:description" content="設定預計時間、按下開始與結束，自動計算多了或少了多久，另附獨立計時器。">
<meta property="og:url" content="https://0123456789.tw/howlong/">
<meta property="og:locale" content="zh_TW">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="這件事做了多久｜計時與預計時間比較工具">
<meta name="twitter:description" content="設定預計時間、按下開始與結束，自動計算多了或少了多久，另附獨立計時器。">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebApplication","name":"這件事做了多久","url":"https://0123456789.tw/howlong/","applicationCategory":"UtilitiesApplication","operatingSystem":"Any","inLanguage":"zh-TW","offers":{"@type":"Offer","price":"0","priceCurrency":"TWD"},"description":"記錄一件事實際花了多久，並與預計時間比較，另附獨立計時器。"}
</script>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Organization","name":"計算Pro","url":"https://0123456789.tw/"}
</script>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"記錄會存在哪裡？","acceptedAnswer":{"@type":"Answer","text":"所有記錄只儲存在你目前使用的瀏覽器（localStorage），不會上傳到伺服器；清除瀏覽器資料或換裝置後記錄不會保留。"}},{"@type":"Question","name":"關掉網頁後計時還會繼續嗎？","acceptedAnswer":{"@type":"Answer","text":"會。系統記錄的是按下開始的時間點，重新開啟網頁後會依照目前時間繼續計算。"}}]}
</script>
<style>
.jt-wrap,.jt-wrap *{box-sizing:border-box}
body{margin:0;background:#EEEEEE;color:#424242;font-family:"Noto Sans TC","Microsoft JhengHei","PingFang TC",sans-serif;line-height:1.6}
.jt-wrap{max-width:980px;margin:0 auto;padding:16px}
.jt-title{font-size:26px;margin:8px 0 4px;color:#A80000;font-weight:700}
.jt-sub{margin:0 0 16px;color:#958E8A;font-size:14px}
.jt-card{background:#fff;border:1px solid #d9d4d1;border-radius:10px;padding:16px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.06)}
.jt-h2{font-size:18px;margin:0 0 12px;padding-left:10px;border-left:4px solid #A80000;color:#424242}
.jt-today{display:flex;flex-wrap:wrap;gap:8px 24px;align-items:baseline;background:#424242;color:#fff;border-radius:8px;padding:10px 14px;margin-bottom:14px}
.jt-today b{font-size:18px}
.jt-clock{font-variant-numeric:tabular-nums;font-size:20px;font-weight:700;color:#fff}
.jt-toolbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px;align-items:center}
.jt-btn{appearance:none;border:1px solid #A80000;background:#A80000;color:#fff;font:inherit;font-size:15px;padding:8px 16px;border-radius:6px;cursor:pointer;min-height:40px;transition:background .15s,transform .05s}
.jt-btn:hover{background:#8c0000}
.jt-btn:active{transform:translateY(1px)}
.jt-btn:disabled{background:#c9c4c1;border-color:#c9c4c1;cursor:not-allowed;color:#fff}
.jt-btn.jt-ghost{background:#fff;color:#A80000}
.jt-btn.jt-ghost:hover{background:#f6e9e9}
.jt-btn.jt-gray{background:#958E8A;border-color:#958E8A}
.jt-btn.jt-gray:hover{background:#7d7773}
.jt-btn.jt-sm{padding:5px 10px;font-size:13px;min-height:32px}
.jt-sound{margin-left:auto;font-size:14px;color:#424242;display:flex;align-items:center;gap:6px;cursor:pointer}
.jt-row{border:1px solid #d9d4d1;border-radius:8px;padding:12px;margin-bottom:12px;background:#fafafa}
.jt-row.jt-running{border-color:#A80000;background:#fff7f7}
.jt-row-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:10px}
.jt-idx{background:#A80000;color:#fff;border-radius:50%;width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;flex:none}
.jt-date{color:#958E8A;font-size:14px;white-space:nowrap}
.jt-input{font:inherit;font-size:15px;padding:6px 8px;border:1px solid #bdb7b3;border-radius:6px;background:#fff;color:#424242;min-width:0}
.jt-input:focus{outline:2px solid #A80000;outline-offset:0;border-color:#A80000}
.jt-name{flex:1 1 160px}
.jt-num{width:64px;text-align:center}
.jt-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px}
.jt-cell{background:#fff;border:1px solid #e3dfdc;border-radius:6px;padding:10px;display:flex;flex-direction:column;gap:6px}
.jt-lbl{font-size:13px;color:#958E8A}
.jt-val{font-size:20px;font-weight:700;font-variant-numeric:tabular-nums;color:#424242;min-height:30px}
.jt-val.jt-over{color:#A80000}
.jt-val.jt-under{color:#2E7D32}
.jt-inline{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.jt-empty{text-align:center;color:#958E8A;padding:20px}
.jt-note{font-size:13px;color:#958E8A;margin:8px 0 0}
.jt-sw{text-align:center;padding:10px 0}
.jt-sw-disp{font-size:56px;font-weight:700;font-variant-numeric:tabular-nums;color:#424242;letter-spacing:1px;line-height:1.2}
.jt-sw-disp small{font-size:28px;color:#958E8A}
.jt-sw-state{display:inline-block;margin:6px 0 14px;padding:2px 14px;border-radius:999px;background:#EEEEEE;color:#958E8A;font-size:14px}
.jt-sw-state.jt-on{background:#A80000;color:#fff}
.jt-sw-state.jt-paused{background:#958E8A;color:#fff}
.jt-sw-btns{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}
.jt-sw-btns .jt-btn{min-width:92px;font-size:17px;padding:10px 18px}
.jt-footer{text-align:center;color:#958E8A;font-size:13px;margin:16px 0}
@media (max-width:520px){
 .jt-sw-disp{font-size:40px}.jt-sw-disp small{font-size:22px}
 .jt-sound{margin-left:0}
}
</style>
</head>
<body>
<div class="jt-wrap" id="jt-app">

 <h1 class="jt-title">這件事做了多久</h1>
 <p class="jt-sub">設定預計時間 → 按下開始 → 按下結束，自動算出比預計多了或少了多久。記錄只存在你的瀏覽器。</p>

 <!-- 區塊一：這件事做了多久 -->
 <section class="jt-card">
  <h2 class="jt-h2">一、記錄這件事做了多久</h2>

  <div class="jt-today">
   <span>今天日期：<b id="jt-today">&#8212;</b></span>
   <span>目前時間：<span class="jt-clock" id="jt-clock">&#8211;:&#8211;:&#8211;</span></span>
  </div>

  <div class="jt-toolbar">
   <button type="button" class="jt-btn" data-action="add">＋ 新增一列</button>
   <button type="button" class="jt-btn jt-ghost" data-action="clearall">清除全部記錄</button>
   <label class="jt-sound"><input type="checkbox" id="jt-sound" data-action="sound" checked> 按鈕音效</label>
  </div>

  <div id="jt-list"></div>
  <p class="jt-note">提示：預計時間可隨時修改，結果會立即重新計算；按「重設」可清除該列的開始與結束時間。</p>
 </section>

 <!-- 區塊二：獨立計時器 -->
 <section class="jt-card">
  <h2 class="jt-h2">二、獨立計時器</h2>
  <div class="jt-sw">
   <div class="jt-sw-disp" id="jt-sw-disp">00:00:00<small>.00</small></div>
   <div class="jt-sw-state" id="jt-sw-state">待機中</div>
   <div class="jt-sw-btns">
    <button type="button" class="jt-btn" id="jt-sw-start" data-action="sw-start">開始</button>
    <button type="button" class="jt-btn jt-gray" id="jt-sw-pause" data-action="sw-pause" disabled>暫停</button>
    <button type="button" class="jt-btn jt-ghost" id="jt-sw-stop" data-action="sw-stop" disabled>停止</button>
    <button type="button" class="jt-btn jt-ghost" id="jt-sw-reset" data-action="sw-reset">歸零</button>
   </div>
   <p class="jt-note">暫停後可按「繼續」接著計時；停止會固定顯示最後的時間，再按「開始」會從 0 重新計時。</p>
  </div>
 </section>

 <div class="jt-footer">© 計算Pro｜資料僅儲存在本機瀏覽器（localStorage）</div>
</div>

<script>
(function () {
 'use strict';

 var KEY_REC = 'jt_howlong_v1';
 var KEY_SW = 'jt_stopwatch_v1';
 var KEY_SND = 'jt_sound_v1';
 var WEEK = ['日', '一', '二', '三', '四', '五', '六'];

 var records = [];
 var sw = { s: 'idle', t0: 0, acc: 0 };
 var soundOn = true;
 var audioCtx = null;

 /* ---------- 工具 ---------- */
 function $(id) { return document.getElementById(id); }
 function pad2(n) { return (n < 10 ? '0' : '') + n; }
 function esc(s) {
  return String(s).replace(/&#038;/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
 }
 function dateStr(d) {
  return d.getFullYear() + '/' + pad2(d.getMonth() + 1) + '/' + pad2(d.getDate());
 }
 function dayKey(ts) {
  var d = new Date(ts);
  return d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();
 }
 function clockStr(ts) {
  var d = new Date(ts);
  return pad2(d.getHours()) + ':' + pad2(d.getMinutes()) + ':' + pad2(d.getSeconds());
 }
 function clockWithDay(ts, baseTs) {
  var s = clockStr(ts);
  var a = new Date(baseTs); a.setHours(0, 0, 0, 0);
  var b = new Date(ts); b.setHours(0, 0, 0, 0);
  var diff = Math.round((b.getTime() - a.getTime()) / 86400000);
  if (diff > 0) { s += ' (+' + diff + '日)'; }
  return s;
 }
 function fmtDur(ms) {
  var t = Math.round(Math.abs(ms) / 1000);
  var h = Math.floor(t / 3600);
  var m = Math.floor((t % 3600) / 60);
  var s = t % 60;
  var out = '';
  if (h > 0) { out += h + ' 小時 '; }
  if (h > 0 || m > 0) { out += m + ' 分 '; }
  out += s + ' 秒';
  return out;
}
 function num(v) {
  var n = parseInt(v, 10);
  return (isNaN(n) || n < 0) ? 0 : n;
 }
 function load(key, fallback) {
  try {
   var raw = localStorage.getItem(key);
   if (raw) { return JSON.parse(raw); }
  } catch (e) {}
  return fallback;
 }
 function save(key, val) {
  try { localStorage.setItem(key, JSON.stringify(val)); } catch (e) {}
 }
 function findRec(id) {
  var i;
  for (i = 0; i < records.length; i++) {
   if (records[i].id === id) { return records[i]; }
  }
  return null;
 }

 /* ---------- 音效 ---------- */
 function tone(freq, start, dur, type, vol) {
  var o = audioCtx.createOscillator();
  var g = audioCtx.createGain();
  o.type = type || 'sine';
  o.frequency.value = freq;
  g.gain.setValueAtTime(0.0001, start);
  g.gain.exponentialRampToValueAtTime(vol || 0.2, start + 0.01);
  g.gain.exponentialRampToValueAtTime(0.0001, start + dur);
  o.connect(g);
  g.connect(audioCtx.destination);
  o.start(start);
  o.stop(start + dur + 0.02);
 }
 function beep(kind) {
  if (!soundOn) { return; }
  try {
   if (!audioCtx) {
    var AC = window.AudioContext || window.webkitAudioContext;
    if (!AC) { return; }
    audioCtx = new AC();
   }
   if (audioCtx.state === 'suspended') { audioCtx.resume(); }
   var t = audioCtx.currentTime;
   if (kind === 'start') {
    tone(784, t, 0.12, 'sine', 0.22);
    tone(1047, t + 0.1, 0.18, 'sine', 0.22);
   } else if (kind === 'pause') {
    tone(660, t, 0.14, 'triangle', 0.22);
   } else if (kind === 'stop') {
    tone(523, t, 0.12, 'square', 0.12);
    tone(392, t + 0.11, 0.2, 'square', 0.12);
   } else if (kind === 'end') {
    tone(1047, t, 0.12, 'sine', 0.22);
    tone(784, t + 0.1, 0.12, 'sine', 0.22);
    tone(523, t + 0.2, 0.22, 'sine', 0.22);
   } else if (kind === 'warn') {
    tone(300, t, 0.18, 'sawtooth', 0.1);
   } else {
    tone(740, t, 0.07, 'sine', 0.18);
   }
  } catch (e) {}
 }

 /* ---------- 今天日期 / 時鐘 ---------- */
 function tickClock() {
  var d = new Date();
  $('jt-today').textContent = dateStr(d) + '（週' + WEEK[d.getDay()] + '）';
  $('jt-clock').textContent = pad2(d.getHours()) + ':' + pad2(d.getMinutes()) + ':' + pad2(d.getSeconds());
 }

 /* ---------- 這件事做了多久 ---------- */
 function newRecord() {
  var d = new Date();
  return {
   id: 'r' + d.getTime() + Math.floor(Math.random() * 1000),
   date: dateStr(d),
   name: '',
   eh: 0,
   em: 30,
   start: null,
   end: null
  };
 }

 function calc(r) {
  var expect = (r.eh * 60 + r.em) * 60000;
  var res = { expect: expect, elapsed: null, diffText: '--', diffClass: '', running: false };
  if (!r.start) { return res; }
  var endTs = r.end ? r.end : Date.now();
  var elapsed = Math.max(0, endTs - r.start);
  res.elapsed = elapsed;
  res.running = !r.end;
  var diff = elapsed - expect;
  var prefix = r.end ? '' : '（進行中）';
  if (Math.round(Math.abs(diff) / 1000) === 0) {
   res.diffText = prefix + '剛好符合預計';
  } else if (diff > 0) {
   res.diffText = prefix + '多了 ' + fmtDur(diff);
   res.diffClass = 'jt-over';
  } else {
   res.diffText = prefix + '少了 ' + fmtDur(diff);
   res.diffClass = 'jt-under';
  }
  return res;
 }

 function rowHtml(r, idx) {
  var c = calc(r);
  var h = '';
  h += '<div class="jt-row' + (c.running ? ' jt-running' : '') + '" data-id="' + r.id + '">';
  h += '<div class="jt-row-head">';
  h += '<span class="jt-idx">' + (idx + 1) + '</span>';
  h += '<span class="jt-date">' + esc(r.date) + '</span>';
  h += '<input type="text" class="jt-input jt-name" data-field="name" maxlength="40" placeholder="這件事是什麼？（可不填）" value="' + esc(r.name) + '">';
  h += '<button type="button" class="jt-btn jt-ghost jt-sm" data-action="reset">重設</button>';
  h += '<button type="button" class="jt-btn jt-ghost jt-sm" data-action="del">刪除</button>';
  h += '</div>';
  h += '<div class="jt-grid">';

  h += '<div class="jt-cell"><span class="jt-lbl">預計花費時間</span>';
  h += '<div class="jt-inline">';
  h += '<input type="number" inputmode="numeric" min="0" max="999" class="jt-input jt-num" data-field="eh" value="' + r.eh + '"> 小時 ';
  h += '<input type="number" inputmode="numeric" min="0" max="59" class="jt-input jt-num" data-field="em" value="' + r.em + '"> 分';
  h += '</div></div>';

  h += '<div class="jt-cell"><span class="jt-lbl">開始時間（時鐘時間）</span>';
  h += '<span class="jt-val" data-out="start">' + (r.start ? clockStr(r.start) : '--:--:--') + '</span>';
  h += '<button type="button" class="jt-btn" data-action="start"' + (r.start ? ' disabled' : '') + '>按下開始</button></div>';

  h += '<div class="jt-cell"><span class="jt-lbl">結束時間（時鐘時間）</span>';
  h += '<span class="jt-val" data-out="end">' + (r.end ? clockWithDay(r.end, r.start) : '--:--:--') + '</span>';
  h += '<button type="button" class="jt-btn" data-action="end"' + ((!r.start || r.end) ? ' disabled' : '') + '>按下結束</button></div>';

  h += '<div class="jt-cell"><span class="jt-lbl">實際花費</span>';
  h += '<span class="jt-val" data-out="elapsed">' + (c.elapsed === null ? '--' : fmtDur(c.elapsed)) + '</span></div>';

  h += '<div class="jt-cell"><span class="jt-lbl">與預計相比</span>';
  h += '<span class="jt-val ' + c.diffClass + '" data-out="diff">' + c.diffText + '</span></div>';

  h += '</div></div>';
  return h;
 }

 function render() {
  var list = $('jt-list');
  if (!records.length) {
   list.innerHTML = '<div class="jt-empty">還沒有記錄，按「＋ 新增一列」開始。</div>';
   return;
  }
  var h = '';
  var i;
  for (i = 0; i < records.length; i++) { h += rowHtml(records[i], i); }
  list.innerHTML = h;
 }

 function updateRow(r) {
  var el = document.querySelector('.jt-row[data-id="' + r.id + '"]');
  if (!el) { return; }
  var c = calc(r);
  var elapsedEl = el.querySelector('[data-out="elapsed"]');
  var diffEl = el.querySelector('[data-out="diff"]');
  elapsedEl.textContent = c.elapsed === null ? '--' : fmtDur(c.elapsed);
  diffEl.textContent = c.diffText;
  diffEl.className = 'jt-val ' + c.diffClass;
 }

 function tickRows() {
  var i;
  for (i = 0; i < records.length; i++) {
   if (records[i].start &#038;&#038; !records[i].end) { updateRow(records[i]); }
  }
 }

 function saveRecords() { save(KEY_REC, records); }

 /* ---------- 獨立計時器 ---------- */
 function swElapsed() {
  return sw.acc + (sw.s === 'run' ? Date.now() - sw.t0 : 0);
 }
 function swRender() {
  var ms = swElapsed();
  var cs = Math.floor(ms / 10) % 100;
  var total = Math.floor(ms / 1000);
  var h = Math.floor(total / 3600);
  var m = Math.floor((total % 3600) / 60);
  var s = total % 60;
  $('jt-sw-disp').innerHTML = pad2(h) + ':' + pad2(m) + ':' + pad2(s) + '<small>.' + pad2(cs) + '</small>';
 }
 function swUI() {
  var st = $('jt-sw-state');
  var bs = $('jt-sw-start');
  var bp = $('jt-sw-pause');
  var bt = $('jt-sw-stop');
  st.className = 'jt-sw-state';
  if (sw.s === 'run') {
   st.textContent = '計時中';
   st.className += ' jt-on';
   bs.disabled = true; bp.disabled = false; bt.disabled = false;
   bs.textContent = '開始';
  } else if (sw.s === 'pause') {
   st.textContent = '已暫停';
   st.className += ' jt-paused';
   bs.disabled = false; bp.disabled = true; bt.disabled = false;
   bs.textContent = '繼續';
  } else if (sw.s === 'stop') {
   st.textContent = '已停止';
   bs.disabled = false; bp.disabled = true; bt.disabled = true;
   bs.textContent = '開始';
  } else {
   st.textContent = '待機中';
   bs.disabled = false; bp.disabled = true; bt.disabled = true;
   bs.textContent = '開始';
  }
  swRender();
 }
 function swSave() { save(KEY_SW, sw); }

 /* ---------- 事件（data-action 委派） ---------- */
 function onClick(e) {
  var t = e.target;
  while (t && t !== document && !(t.getAttribute && t.getAttribute('data-action'))) { t = t.parentNode; }
  if (!t || t === document) { return; }
  var action = t.getAttribute('data-action');
  if (action === 'sound') { return; }
  if (t.disabled) { return; }

  var rowEl = t.closest ? t.closest('.jt-row') : null;
  var r = rowEl ? findRec(rowEl.getAttribute('data-id')) : null;
  var now = Date.now();

  if (action === 'add') {
   beep('click');
   records.push(newRecord());
   saveRecords(); render();
  } else if (action === 'clearall') {
   if (!records.length) { return; }
   beep('warn');
   if (window.confirm('確定要清除全部記錄嗎？此動作無法復原。')) {
    records = [];
    saveRecords(); render();
   }
  } else if (action === 'start' && r) {
   beep('start');
   r.start = now; r.end = null; r.date = dateStr(new Date(now));
   saveRecords(); render();
  } else if (action === 'end' && r) {
   beep('end');
   r.end = now;
   saveRecords(); render();
  } else if (action === 'reset' && r) {
   beep('click');
   r.start = null; r.end = null;
   saveRecords(); render();
  } else if (action === 'del' && r) {
   beep('warn');
   if (window.confirm('確定要刪除這一列嗎？')) {
    var i;
    for (i = 0; i < records.length; i++) {
     if (records[i].id === r.id) { records.splice(i, 1); break; }
    }
    saveRecords(); render();
   }
  } else if (action === 'sw-start') {
   beep('start');
   if (sw.s === 'pause') {
    sw.t0 = now; sw.s = 'run';
   } else {
    sw.acc = 0; sw.t0 = now; sw.s = 'run';
   }
   swSave(); swUI();
  } else if (action === 'sw-pause') {
   if (sw.s !== 'run') { return; }
   beep('pause');
   sw.acc += now - sw.t0; sw.s = 'pause';
   swSave(); swUI();
  } else if (action === 'sw-stop') {
   if (sw.s !== 'run' &#038;&#038; sw.s !== 'pause') { return; }
   beep('stop');
   if (sw.s === 'run') { sw.acc += now - sw.t0; }
   sw.s = 'stop';
   swSave(); swUI();
  } else if (action === 'sw-reset') {
   beep('click');
   sw.s = 'idle'; sw.acc = 0; sw.t0 = 0;
   swSave(); swUI();
  }
 }

 function onInput(e) {
  var t = e.target;
  var field = t.getAttribute ? t.getAttribute('data-field') : null;
  if (!field) { return; }
  var rowEl = t.closest ? t.closest('.jt-row') : null;
  if (!rowEl) { return; }
  var r = findRec(rowEl.getAttribute('data-id'));
  if (!r) { return; }
  if (field === 'name') {
   r.name = t.value;
  } else if (field === 'eh') {
   r.eh = num(t.value);
   updateRow(r);
  } else if (field === 'em') {
   r.em = num(t.value);
   updateRow(r);
  }
  saveRecords();
 }

 function onSound(e) {
  if (e.target &#038;&#038; e.target.id === 'jt-sound') {
   soundOn = e.target.checked;
   save(KEY_SND, soundOn ? 1 : 0);
   if (soundOn) { beep('click'); }
  }
 }

 /* ---------- 初始化 ---------- */
 function init() {
  var saved = load(KEY_REC, []);
  if (saved &#038;&#038; saved.length) {
   var i;
   for (i = 0; i < saved.length; i++) {
    var r = saved[i];
    records.push({
     id: r.id || ('r' + i + Date.now()),
     date: r.date || dateStr(new Date()),
     name: r.name || '',
     eh: num(r.eh),
     em: num(r.em),
     start: r.start || null,
     end: r.end || null
    });
   }
  } else {
   records.push(newRecord());
  }

  var savedSw = load(KEY_SW, null);
  if (savedSw &#038;&#038; savedSw.s) {
   sw.s = savedSw.s; sw.t0 = savedSw.t0 || 0; sw.acc = savedSw.acc || 0;
  }
  soundOn = load(KEY_SND, 1) ? true : false;
  $('jt-sound').checked = soundOn;

  document.addEventListener('click', onClick);
  document.addEventListener('input', onInput);
  document.addEventListener('change', onSound);

  render(); swUI(); tickClock();
  setInterval(function () { tickClock(); tickRows(); }, 1000);
  setInterval(function () { if (sw.s === 'run') { swRender(); } }, 50);
 }

 init();
})();
</script>
</body>
</html>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>定時開啟網址工具(搶票倒數.待辦提醒)</title>
		<link>https://0123456789.tw/urlopen/</link>
		
		
		<pubDate>Wed, 02 Sep 2026 04:27:06 +0000</pubDate>
				<category><![CDATA[計算blog文]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2239</guid>

					<description><![CDATA[前往使用：https://0123456789.tw/urlopentimer 使用這個定時開啟網址的工具可以 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">前往使用：<a href="https://0123456789.tw/urlopentimer">https://0123456789.tw/urlopentimer</a></p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://imgpoi.com/i/QRZEB5.png" alt=""/></figure>



<p class="wp-block-paragraph">使用這個定時開啟網址的工具可以搭配這一個快速複製貼上的工具，達到開啟網頁之後就快速把資訊複製貼上讓搶票更快速</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-0123456789 wp-block-embed-0123456789"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="0lWcvnbEBt"><a href="https://0123456789.tw/ticket/">快速複製貼上(搶票.搶商品.報名表單)</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="快速複製貼上(搶票.搶商品.報名表單) — 計算0123456789" src="https://0123456789.tw/ticket/embed/#?secret=aM2Fk1glJs#?secret=0lWcvnbEBt" data-secret="0lWcvnbEBt" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<figure class="wp-block-image size-large"><a href="https://0123456789.tw/urlopentimer/"><img decoding="async" src="https://imgpoi.com/i/QRZBJ9.png" alt=""/></a></figure>



<p class="wp-block-paragraph">前往使用：<a href="https://0123456789.tw/urlopentimer">https://0123456789.tw/urlopentimer</a></p>



<p class="wp-block-paragraph">提醒：多數瀏覽器會封鎖非使用者點擊觸發的分頁彈出。若時間到後沒有自動開啟新分頁，該列會顯示「點我開啟」按鈕，請手動點擊。<br>若想測試自動彈出功能，可在被封鎖後，於瀏覽器網址列右側找到彈出視窗封鎖圖示，點選「一律允許此網站顯示彈出式視窗」，之後同一頁籤內時間到即可自動開啟新分頁，不需再手動點擊。<br>設定內容會自動儲存在瀏覽器中，重新整理頁面不會遺失。</p>



<h2 class="wp-block-heading">常見問題</h2>



<p class="wp-block-paragraph">定時開啟網址工具會不會自動彈出新分頁？多數瀏覽器預設會封鎖非使用者點擊觸發的分頁彈出。若時間到後沒有自動開啟，畫面會顯示「點我開啟」按鈕，手動點擊即可；也可以在瀏覽器網址列允許此網站顯示彈出視窗，之後時間到即可自動開啟。設定的網址和時間會不會遺失？所有設定會自動儲存在瀏覽器的本機儲存空間（localStorage），重新整理頁面不會遺失，但清除瀏覽器資料或更換裝置、瀏覽器就需要重新設定。可以同時設定幾個網址排程？可以無限新增多列，每一列可設定不同的網址和開啟時間，並提供即時倒數計時，適合同時管理多個定時提醒。</p>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>台灣蔬菜水果產季月曆-依「有生產的月份」整理｜不是「全年都買得到」</title>
		<link>https://0123456789.tw/wawamonth/</link>
		
		
		<pubDate>Wed, 26 Aug 2026 04:47:39 +0000</pubDate>
				<category><![CDATA[線上表格類]]></category>
		<category><![CDATA[日曆]]></category>
		<category><![CDATA[月份]]></category>
		<category><![CDATA[統計]]></category>
		<category><![CDATA[蔬菜]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2230</guid>

					<description><![CDATA[台灣蔬菜／水果產季月曆｜1～12月 台灣蔬菜／水果產季月曆 依「台灣有生產的月份」整理｜不是「全年都買得到」  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<!doctype html>
<html lang="zh-Hant">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>台灣蔬菜／水果產季月曆｜1～12月</title>
<style>
*{box-sizing:border-box}body{margin:0;background:#f6f5f2;color:#424242;font-family:-apple-system,BlinkMacSystemFont,"Noto Sans TC","Microsoft JhengHei",sans-serif}
header{background:#fff;border-bottom:1px solid #ddd;text-align:center;padding:30px 16px 24px}h1{margin:0 0 7px;font-size:28px}header p{margin:0;color:#777}
.wrap{max-width:1200px;margin:auto;padding:20px}.toolbar{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:10px}
button,input{font:inherit}button{border:1px solid #ccc;background:#fff;border-radius:10px;padding:9px 13px;cursor:pointer}
button.active{background:#A80000;color:#fff;border-color:#A80000}input{flex:1;min-width:220px;padding:10px 13px;border:1px solid #ccc;border-radius:10px;background:#fff}
.typebar{display:flex;gap:9px;margin-bottom:14px}
.months{display:grid;grid-template-columns:repeat(12,1fr);gap:6px;margin-bottom:18px}.months button{padding:8px 2px}
.card{background:#fff;border:1px solid #ddd;border-radius:14px;overflow:hidden}.card h2{margin:0;padding:15px 16px;border-bottom:1px solid #eee;font-size:20px}
.cat{padding:13px 16px}.cat-title{font-weight:700;margin-bottom:8px}.tags{display:flex;flex-wrap:wrap;gap:7px}.tag{background:#f0efec;border-radius:999px;padding:6px 10px;font-size:14px}
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.item{background:#fff;border:1px solid #ddd;border-radius:12px;padding:14px}.item h3{margin:0 0 4px}.item small{color:#777}
.bar{display:grid;grid-template-columns:repeat(12,1fr);gap:3px;margin-top:10px}.dot{height:12px;border-radius:3px;background:#e8e8e8}.dot.on{background:#A80000}.dot.now{outline:2px solid #333;outline-offset:1px}
.month-labels{display:grid;grid-template-columns:repeat(12,1fr);font-size:10px;color:#999;text-align:center;margin-top:4px}
.note{margin-top:18px;background:#fff;border:1px solid #ddd;border-radius:10px;padding:14px;font-size:13px;line-height:1.75;color:#666}
.import-block{margin-top:16px;background:#fff;border:1px dashed #bbb;border-radius:14px;padding:15px 16px}
.import-block h2{margin:0 0 10px;font-size:17px;color:#424242}
.import-list{display:flex;flex-direction:column;gap:8px}
.import-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;padding:9px 11px;background:#f7f6f3;border-radius:9px}
.import-row .iname{font-weight:700;color:#424242}
.import-row .ibadge{background:#958E8A;color:#fff;font-size:11px;padding:3px 8px;border-radius:999px}
.import-row .ireason{color:#777;font-size:13px}
.import-item{background:#fff;border:1px solid #ddd;border-radius:12px;padding:14px;opacity:.85}
.import-item h3{margin:0 0 4px;display:flex;align-items:center;gap:7px}
.import-item .ibadge{background:#958E8A;color:#fff;font-size:11px;padding:3px 8px;border-radius:999px;font-weight:400}
@media(max-width:800px){.months{grid-template-columns:repeat(6,1fr)}.grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:500px){h1{font-size:23px}.wrap{padding:12px}.grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<header><h1>台灣蔬菜／水果產季月曆</h1><p>依「台灣有生產的月份」整理｜不是「全年都買得到」</p></header>
<div class="wrap">

<div class="typebar">
<button class="active" data-type="veg">蔬菜</button>
<button data-type="fruit">水果</button>
</div>

<div class="toolbar">
<button class="active" data-view="month">依月份</button><button data-view="item">依名稱</button>
<input id="search" placeholder="搜尋：小白菜、高麗菜、玉米、菠菜…">
</div>
<div id="monthBtns" class="months"></div><div id="content"></div>

<div class="note">
<strong>本頁定義：</strong>「產季」指台灣有生產、可作為當季食材參考的月份；不等於其他月份完全沒有進口品或設施栽培。
<br><strong>資料整理原則：</strong>蔬菜部分你提供的 9～12 月清單作為主要基礎，1～8 月依台灣公開產季資料與季節性農作資訊補足；水果部分依農糧署公開產期分布資料與一般市場慣用產季彙整。不同品種、產地、海拔及氣候會造成產期差異，因此本表適合「吃當季」的生活型查詢，而非精確農產統計。
<br><strong>特別注意：</strong>例如小白菜在本表不是全年，而是依你的需求標示為 <b>9～12月</b>；大白菜則為 <b>11～12月</b>。菇類雖可全年供應，但若追求「田間當季」，也不應一律視為全年自然產季。
<br><strong>水果「台灣無生產」標注：</strong>凡本表列為無產季（例如藍莓、櫻桃、奇異果、榴槤、山竹等），代表台灣氣候不適合商業化栽培或僅有極少量試種，市售商品幾乎全為進口，因此不提供月份分布，僅列出並標注原因供參考。
</div>
</div>
<script>
// ---------- 蔬菜資料 ----------
const rawVeg=[["葉菜類", "A菜", "1-5,9-12"], ["葉菜類", "地瓜葉", "5-10"], ["葉菜類", "小白菜", "9-12"], ["葉菜類", "娃娃菜", "10-12"], ["葉菜類", "大白菜", "11-12"], ["葉菜類", "山茼蒿", "10-12"], ["葉菜類", "油菜", "1-5,9-12"], ["葉菜類", "福山萵苣", "9-12"], ["葉菜類", "空心菜", "5-10"], ["葉菜類", "芥蘭菜", "9-12"], ["葉菜類", "茴香菜", "10-12"], ["葉菜類", "莧菜", "5-10"], ["葉菜類", "蚵白菜", "1-5,9-12"], ["葉菜類", "青江菜", "1-5,9-12"], ["葉菜類", "高麗菜", "1-5,8-12"], ["葉菜類", "龍鬚菜", "5-10"], ["葉菜類", "美生菜", "10-4"], ["葉菜類", "茼蒿", "11-3"], ["葉菜類", "菠菜", "11-3"], ["葉菜類", "A菜心", "11-3"], ["根莖類", "地瓜", "1-12"], ["根莖類", "山藥", "9-12"], ["根莖類", "水蓮", "9-12"], ["根莖類", "烏殼綠竹筍", "5-10"], ["根莖類", "綠竹筍", "5-10"], ["根莖類", "芋頭", "9-12"], ["根莖類", "茭白筍", "5-10"], ["根莖類", "菱角", "8-12"], ["根莖類", "蓮藕", "7-12"], ["根莖類", "蘆筍", "3-11"], ["根莖類", "麻竹筍", "4-9"], ["根莖類", "A菜心", "11-3"], ["根莖類", "大頭菜", "11-3"], ["根莖類", "大心菜心", "11-3"], ["根莖類", "抱子芥菜", "11-3"], ["根莖類", "白蘿蔔", "11-4"], ["根莖類", "紅蘿蔔", "10-4"], ["根莖類", "荸薺", "9-12"], ["根莖類", "豆薯", "10-3"], ["根莖類", "馬鈴薯", "1-5"], ["瓜果類", "南瓜", "9-12"], ["瓜果類", "大黃瓜", "9-12"], ["瓜果類", "小黃瓜", "9-12"], ["瓜果類", "櫛瓜", "9-12"], ["瓜果類", "玉米", "7-12"], ["瓜果類", "玉米筍", "1-4,9-12"], ["瓜果類", "秋葵", "6-10"], ["瓜果類", "苦瓜", "5-12"], ["瓜果類", "青苦瓜", "5-12"], ["瓜果類", "茄子", "5-12"], ["瓜果類", "蒲瓜", "4-10"], ["瓜果類", "青木瓜", "1-12"], ["瓜果類", "番茄", "10-6"], ["瓜果類", "青花菜", "10-4"], ["瓜果類", "青花筍", "11-4"], ["瓜果類", "甜椒", "10-6"], ["瓜果類", "青椒", "9-12"], ["豆類", "四季豆", "9-4"], ["豆類", "菜豆", "9-4"], ["豆類", "毛豆", "6-12"], ["豆類", "皇帝豆", "11-2"], ["豆類", "甜豆", "11-3"], ["豆類", "荷蘭豆", "11-3"], ["豆類", "豆芽菜", "1-12"], ["豆類", "豌豆", "11-3"], ["豆類", "醜豆", "9-10"], ["辛香類", "九層塔", "5-10"], ["辛香類", "巴西里", "10-3"], ["辛香類", "芹菜", "10-6"], ["辛香類", "芹菜管", "10-3"], ["辛香類", "薑", "9-12"], ["辛香類", "青蒜", "11-3"], ["辛香類", "青蔥", "1-12"], ["辛香類", "青龍辣椒", "9-12"], ["辛香類", "辣椒", "10-6"], ["辛香類", "韭菜", "1-12"], ["辛香類", "韭菜花", "1-12"], ["辛香類", "韭菜黃", "1-12"], ["辛香類", "香菜", "10-3"], ["辛香類", "西洋芹", "10-3"], ["菇類", "乾香菇", "1-12"], ["菇類", "杏鮑菇", "1-12"], ["菇類", "生香菇", "1-12"], ["菇類", "白木耳", "1-12"], ["菇類", "秀珍菇", "1-12"], ["菇類", "金滑菇", "1-12"], ["菇類", "金針菇", "1-12"], ["菇類", "雪白菇", "1-12"], ["菇類", "鴻喜菇", "1-12"], ["菇類", "黑木耳", "5-10"], ["菇類", "洋菇", "10-5"]];

// ---------- 水果資料（有台灣產季）----------
const rawFruit=[
["熱帶／副熱帶","香蕉","1-12"],
["熱帶／副熱帶","鳳梨","1-12"],
["熱帶／副熱帶","木瓜","1-12"],
["熱帶／副熱帶","芭樂","1-12"],
["熱帶／副熱帶","蓮霧","11-4"],
["熱帶／副熱帶","火龍果","5-11"],
["熱帶／副熱帶","西瓜","4-9"],
["熱帶／副熱帶","香瓜","3-9"],
["熱帶／副熱帶","芒果","4-8"],
["熱帶／副熱帶","百香果","3-11"],
["熱帶／副熱帶","釋迦","7-2"],
["熱帶／副熱帶","鳳梨釋迦","11-4"],
["熱帶／副熱帶","酪梨","7-11"],
["核果仁果類","荔枝","5-7"],
["核果仁果類","龍眼","7-9"],
["核果仁果類","枇杷","2-4"],
["核果仁果類","梅子","3-5"],
["核果仁果類","李子","3-6"],
["核果仁果類","桃子／水蜜桃","4-9"],
["核果仁果類","水梨","6-9"],
["核果仁果類","葡萄","6-8,12-2"],
["核果仁果類","楊桃","8-2"],
["柑橘類","椪柑","11-1"],
["柑橘類","桶柑","12-3"],
["柑橘類","茂谷柑","12-3"],
["柑橘類","柳丁","10-2"],
["柑橘類","金柑／金橘","11-3"],
["柑橘類","檸檬","1-12"],
["柑橘類","文旦柚","8-10"],
["柑橘類","白柚","9-11"],
["漿果與其他","草莓","11-4"],
["漿果與其他","柿子","9-12"],
["漿果與其他","甜柿","10-12"]
];

// ---------- 台灣無生產（以進口為主）水果 ----------
const importFruit=[
["藍莓","台灣僅極少量高冷地試種，市售幾乎全為美國、智利等地進口"],
["蘋果","僅福壽山等高冷地小量栽培，市售以美國、日本、紐西蘭進口為主"],
["櫻桃","氣候不適合商業栽培，市售為美國、日本、智利進口"],
["奇異果","氣候限制，商業產量極少，市售以紐西蘭進口為主"],
["榴槤","熱帶果樹在台灣氣候下無法商業結果，全為泰國、馬來西亞進口"],
["山竹","不耐台灣氣候與環境，全為泰國、印尼等地進口"],
["蔓越莓","溫帶漿果，台灣未商業栽培，多為美國、加拿大進口（常見為果乾）"],
["覆盆莓","台灣未商業化栽培，市售多為進口或冷凍品"]
];

function expand(s){let out=[];s.split(",").forEach(p=>{let [a,b]=p.split("-").map(Number);if(a<=b){for(let i=a;i<=b;i++)out.push(i)}else{for(let i=a;i<=12;i++)out.push(i);for(let i=1;i<=b;i++)out.push(i)}});return [...new Set(out)]}

const DATA={
 veg:{ list: rawVeg.map(x=>[...x,expand(x[2])]), imports:[], label:"蔬菜", ph:"搜尋：小白菜、高麗菜、玉米、菠菜…" },
 fruit:{ list: rawFruit.map(x=>[...x,expand(x[2])]), imports: importFruit, label:"水果", ph:"搜尋：芒果、草莓、釋迦、檸檬…" }
};

let type="veg", mode="month", selected=new Date().getMonth()+1;

function cats(){ return [...new Set(DATA[type].list.map(x=>x[0]))]; }

function renderMonths(){monthBtns.innerHTML=Array.from({length:12},(_,i)=>`<button class="${selected===i+1?'active':''}" onclick="selectMonth(${i+1})">${i+1}月</button>`).join("")}
function selectMonth(m){selected=m;renderMonths();render()}

function importBlock(){
 const im=DATA[type].imports;
 if(!im.length) return "";
 if(mode==="month"){
  return `<div class="import-block"><h2>台灣不產，市售以進口為主</h2><div class="import-list">${im.map(x=>`<div class="import-row"><span class="iname">${x[0]}</span><span class="ibadge">無台灣產季</span><span class="ireason">${x[1]}</span></div>`).join("")}</div></div>`;
 }
 return "";
}

function render(){
 const q=search.value.trim().toLowerCase(),c=document.getElementById("content");
 const D=DATA[type].list, im=DATA[type].imports;
 if(mode==="month"){
  let h=`<div class="card"><h2>${selected}月｜台灣當季${DATA[type].label}</h2>`;
  cats().forEach(cat=>{let a=D.filter(x=>x[0]===cat&&x[3].includes(selected)&&(!q||x[1].toLowerCase().includes(q)));if(a.length)h+=`<div class="cat"><div class="cat-title">${cat}</div><div class="tags">${a.map(x=>`<span class="tag">${x[1]}</span>`).join("")}</div></div>`});
  c.innerHTML=h+"</div>"+importBlock();
 }else{
  let a=D.filter(x=>!q||x[1].toLowerCase().includes(q));
  let itemsHtml=a.map(x=>`<div class="item"><h3>${x[1]}</h3><small>${x[0]}｜產季：${x[2]}月</small><div class="bar">${Array.from({length:12},(_,i)=>`<span class="dot ${x[3].includes(i+1)?'on':''} ${selected===i+1?'now':''}"></span>`).join("")}</div><div class="month-labels">${Array.from({length:12},(_,i)=>`<span>${i+1}</span>`).join("")}</div></div>`).join("");
  let impFiltered=im.filter(x=>!q||x[0].toLowerCase().includes(q));
  let impHtml=impFiltered.map(x=>`<div class="import-item"><h3>${x[0]}<span class="ibadge">無台灣產季</span></h3><small>${x[1]}</small></div>`).join("");
  c.innerHTML=`<div class="grid">${itemsHtml}${impHtml}</div>`;
 }
}

document.querySelectorAll("[data-view]").forEach(b=>b.onclick=()=>{mode=b.dataset.view;document.querySelectorAll("[data-view]").forEach(x=>x.classList.remove("active"));b.classList.add("active");render()});
document.querySelectorAll("[data-type]").forEach(b=>b.onclick=()=>{type=b.dataset.type;document.querySelectorAll("[data-type]").forEach(x=>x.classList.remove("active"));b.classList.add("active");search.placeholder=DATA[type].ph;search.value="";render()});

search.oninput=render;renderMonths();render();
</script>
</body></html>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>電商分潤網址清洗器</title>
		<link>https://0123456789.tw/shopeeurl/</link>
		
		
		<pubDate>Thu, 20 Aug 2026 04:32:23 +0000</pubDate>
				<category><![CDATA[線上工具類]]></category>
		<category><![CDATA[分潤]]></category>
		<category><![CDATA[短網址]]></category>
		<category><![CDATA[蝦皮]]></category>
		<category><![CDATA[解析]]></category>
		<category><![CDATA[還原網址]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2226</guid>

					<description><![CDATA[點此前往使用：https://0123456789.tw/shopeeurl/ 貼上分享連結，例如 threa [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://0123456789.tw/shopeeurl/"><img decoding="async" width="581" height="555" src="https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-20_12.25.35.jpg" alt="" class="wp-image-2227" srcset="https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-20_12.25.35.jpg 581w, https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-20_12.25.35-300x287.jpg 300w" sizes="(max-width: 581px) 100vw, 581px" /></a></figure>



<p class="wp-block-paragraph"><a href="https://0123456789.tw/shopeeurl/">點此前往使用：https://0123456789.tw/shopeeurl/</a></p>



<p class="wp-block-paragraph">貼上分享連結，例如 threads.com / facebook 轉址、蝦皮短網址、帶有 fbclid、utm_source 等追蹤碼的網址， 自動展開所有跳轉並移除追蹤碼、推薦碼，取得最乾淨的原始網址。</p>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>台灣交通號誌互動判讀器</title>
		<link>https://0123456789.tw/traffic-signal/</link>
		
		
		<pubDate>Wed, 19 Aug 2026 04:10:46 +0000</pubDate>
				<category><![CDATA[本站內嵌計算機]]></category>
		<category><![CDATA[交通號誌]]></category>
		<category><![CDATA[判讀]]></category>
		<category><![CDATA[燈號]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2214</guid>

					<description><![CDATA[台灣交通號誌互動判讀器 台灣交通號誌互動判讀器 自己點亮燈號，立即判斷「左轉、直行、右轉」能不能走 ① 點選號 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>台灣交通號誌互動判讀器</title>
<style>
*{box-sizing:border-box}
:root{
  --bg:#f1f1f1;--panel:#f1f1f1;--panel2:#f1f1f1;--line:#3a404c;
  --text:#666;--muted:#aeb4bf;--green:#20d15a;--yellow:#ffd21c;
  --red:#ff3348;--blue:#4da3ff;--ok:#24d36b
}
body{margin:0;background:#f1f1f1;color:var(--text);
font-family:-apple-system,BlinkMacSystemFont,"Noto Sans TC","PingFang TC","Microsoft JhengHei",sans-serif}
.wrap{max-width:1050px;margin:auto;padding:24px 16px 45px}
h1{text-align:center;font-size:clamp(26px,5vw,42px);margin:8px 0 6px}
.sub{text-align:center;color:var(--muted);margin:0 0 24px}
.grid{display:grid;grid-template-columns:330px 1fr;gap:18px}
.card{background:rgba(24,27,34,.96);border:1px solid var(--line);border-radius:18px;padding:18px}
h2{font-size:20px;margin:0 0 14px}
.traffic{background:#08090b;border-radius:28px;padding:20px 28px;width:170px;margin:5px auto 16px}
.lamp{width:82px;height:82px;border-radius:50%;margin:12px auto;background:#2a2d33;border:5px solid #17191e;
box-shadow:inset 0 0 15px #000;cursor:pointer;transition:.18s}
.lamp.red.on{background:var(--red);box-shadow:0 0 28px rgba(255,51,72,.65)}
.lamp.yellow.on{background:var(--yellow);box-shadow:0 0 28px rgba(255,210,28,.65)}
.lamp.green.on{background:var(--green);box-shadow:0 0 28px rgba(32,209,90,.65)}
.arrowbox{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:12px}
.arrow{background:#272b34;border:1px solid #454b57;border-radius:10px;padding:11px 4px;text-align:center;cursor:pointer;font-size:24px}
.arrow.active{border-color:var(--green);background:#12361f;color:var(--green)}
.small{font-size:12px;color:var(--muted);text-align:center}
.btns{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
.preset{background:#252a33;border:1px solid #454b57;color:#fff;padding:11px 8px;border-radius:10px;cursor:pointer;font-size:13px;line-height:1.4}
.preset:hover{background:#303641}
.result{min-height:280px}
.status{display:flex;align-items:center;gap:12px;border-radius:14px;padding:15px;margin-bottom:16px;background:#22262f}
.status-dot{width:17px;height:17px;border-radius:50%;background:#777;flex:none}
.status-dot.ok{background:var(--green);box-shadow:0 0 14px rgba(32,209,90,.6)}
.status-dot.warn{background:var(--yellow);box-shadow:0 0 14px rgba(255,210,28,.5)}
.status-dot.stop{background:var(--red);box-shadow:0 0 14px rgba(255,51,72,.5)}
.status strong{font-size:21px}
.directions{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.dir{padding:18px 8px;text-align:center;border-radius:14px;background:#242832;border:1px solid #353b46}
.dir .icon{font-size:34px;display:block;margin-bottom:5px}
.dir.yes{background:#11331e;border-color:#1ca94e;color:#69ed91}
.dir.no{color:#ff6878;background:#2d1b20;border-color:#63313a}
.dir.caution{color:#ffe36a;background:#332e15;border-color:#6b5d19}
.note{margin-top:15px;padding:13px;border-radius:12px;background:#12151a;color:#c9ced7;line-height:1.7}
.rules{margin-top:18px}
.rules button{width:100%;text-align:left}
.tag{display:inline-block;padding:4px 8px;border-radius:99px;font-size:12px;background:#303641;color:#cbd2dd;margin-right:6px}
.special{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
.special .preset{min-height:62px}
footer{text-align:center;color:#747b87;font-size:12px;margin-top:22px;line-height:1.7}
@media(max-width:760px){.grid{grid-template-columns:1fr}.special{grid-template-columns:1fr}.traffic{width:150px;padding:15px 22px}.lamp{width:72px;height:72px}}
</style>
</head>
<body>
<div class="wrap">
<h1>台灣交通號誌互動判讀器</h1>
<p class="sub">自己點亮燈號，立即判斷「左轉、直行、右轉」能不能走</p>

<div class="grid">
<section class="card">
<h2>① 點選號誌</h2>
<div class="traffic">
  <div id="red" class="lamp red" title="點擊切換紅燈"></div>
  <div id="yellow" class="lamp yellow" title="點擊切換黃燈"></div>
  <div id="green" class="lamp green" title="點擊切換綠燈"></div>
</div>
<div class="small">圓形燈只能單選；箭頭可「同時」點亮多個</div>

<div class="arrowbox">
  <div class="arrow" data-arrow="left">←</div>
  <div class="arrow" data-arrow="straight">↑</div>
  <div class="arrow" data-arrow="right">→</div>
</div>

<h2 style="margin-top:20px">快速情境</h2>
<div class="btns">
  <button class="preset" data-preset="green"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 圓形綠燈</button>
  <button class="preset" data-preset="green_left"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />＋<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />← 綠燈＋左箭頭</button>
  <button class="preset" data-preset="straight_only"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />↑ 僅直行箭頭</button>
  <button class="preset" data-preset="straight_right"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />↑→ 直行＋右箭頭</button>
  <button class="preset" data-preset="red_left"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" />＋<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />← 紅燈＋左箭頭</button>
  <button class="preset" data-preset="red_right"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" />＋<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />→ 紅燈＋右箭頭</button>
  <button class="preset" data-preset="red"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 圓形紅燈</button>
  <button class="preset" data-preset="yellow"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e1.png" alt="🟡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 圓形黃燈</button>
  <button class="preset" data-preset="flashgreen"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 閃光圓形綠燈</button>
  <button class="preset" data-preset="flashyellow"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e1.png" alt="🟡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 閃光黃燈</button>
  <button class="preset" data-preset="flashred"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 閃光紅燈</button>
  <button class="preset" data-preset="flashleft"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" />← 閃光左箭頭</button>
  <button class="preset" data-preset="off">清除</button>
</div>
</section>

<section class="card result">
<h2>② 判讀結果</h2>
<div id="status" class="status">
  <span id="dot" class="status-dot"></span>
  <div><strong id="title">請點選燈號</strong><div id="desc">選擇左側號誌後，這裡會顯示行駛規則。</div></div>
</div>

<div class="directions">
  <div id="leftResult" class="dir"><span class="icon">↰</span><b>左轉</b><div>—</div></div>
  <div id="straightResult" class="dir"><span class="icon">↑</span><b>直行</b><div>—</div></div>
  <div id="rightResult" class="dir"><span class="icon">↱</span><b>右轉</b><div>—</div></div>
</div>
<div id="note" class="note">提示：圓形綠燈准許直行或左、右轉；箭頭綠燈只可依箭頭方向行駛（可同時亮不只一個箭頭）。</div>

<div class="rules">
<h2 style="margin-top:22px">③ 特殊號誌補充</h2>
<div class="special">
<button class="preset" data-special="pedgreen"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6b6.png" alt="🚶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 綠色行人</button>
<button class="preset" data-special="pedred"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6d1.png" alt="🛑" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 紅色行人</button>
<button class="preset" data-special="pedflash"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6b6-200d-2642-fe0f.png" alt="🚶‍♂️" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 閃光行人</button>
<button class="preset" data-special="lanegreen"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b07.png" alt="⬇" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 綠色車道箭頭</button>
<button class="preset" data-special="lanered"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 紅色 X</button>
<button class="preset" data-special="rail"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f686.png" alt="🚆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 鐵路平交道</button>
</div>
</div>
</section>
</div>

<footer>
本工具為交通號誌學習工具。實際行車仍應以現場號誌、標誌、標線、交通指揮及相關法規為準。
</footer>
</div>

<script>
(function(){
'use strict';

// state.color：圓形燈（單選：red / yellow / green / null）
// state.arrows：箭頭燈，可同時多選 {left,straight,right}
var state={color:null,arrows:{left:false,straight:false,right:false},flash:false,special:null};

var presets={
 green:{color:'green'},
 green_left:{color:'green',arrows:['left']},
 straight_only:{color:null,arrows:['straight']},
 straight_right:{color:null,arrows:['straight','right']},
 red_left:{color:'red',arrows:['left']},
 red_right:{color:'red',arrows:['right']},
 red:{color:'red'},
 yellow:{color:'yellow'},
 flashgreen:{color:'green',flash:true},
 flashyellow:{color:'yellow',flash:true},
 flashred:{color:'red',flash:true},
 flashleft:{color:null,arrows:['left'],flash:true},
 off:{}
};

function $(id){return document.getElementById(id)}

function setState(o){
 var arrowsObj={left:false,straight:false,right:false};
 (o.arrows||[]).forEach(function(a){arrowsObj[a]=true});
 state={color:o.color||null,arrows:arrowsObj,flash:!!o.flash,special:null};
 render();
}

function toggleArrow(name){
 var na={left:state.arrows.left,straight:state.arrows.straight,right:state.arrows.right};
 na[name]=!na[name];
 state={color:state.color,arrows:na,flash:state.flash,special:null};
 render();
}

function toggleColor(c){
 state={color:(state.color===c?null:c),arrows:state.arrows,flash:false,special:null};
 render();
}

function activeArrowList(){
 var list=[];
 ['left','straight','right'].forEach(function(a){if(state.arrows[a])list.push(a)});
 return list;
}

function result(el,cls,text){
 el.className='dir '+cls;
 el.querySelector('div').textContent=text;
}

var LABEL={left:'左轉',straight:'直行',right:'右轉'};

function render(){
 ['red','yellow','green'].forEach(function(c){
   $(c).classList.toggle('on',state.color===c);
 });
 document.querySelectorAll('.arrow').forEach(function(a){
   var name=a.getAttribute('data-arrow');
   a.classList.toggle('active',!!state.arrows[name]);
 });

 var title=$('title'),desc=$('desc'),dot=$('dot'),note=$('note');
 dot.className='status-dot';
 var L='—',S='—',R='—',lc='',sc='',rc='';
 var arrows=activeArrowList();
 var hasArrows=arrows.length>0;

 function setDir(name,ok,cautionOnly){
  var mark = ok ? (cautionOnly?'&#x26a0; 儘量不再'+LABEL[name]:'✓ 可以') : '✕ 禁止';
  var cls = ok ? (cautionOnly?'caution':'yes') : 'no';
  if(name==='left'){L=mark;lc=cls}
  if(name==='straight'){S=mark;sc=cls}
  if(name==='right'){R=mark;rc=cls}
 }

 if(!state.color && !hasArrows && !state.special){
   title.textContent='請點選燈號'; desc.textContent='選擇左側號誌後，這裡會顯示行駛規則。';
 } else if(state.special){
   renderSpecial(); return;

 // ===== 閃光號誌 =====
 } else if(state.flash && state.color==='red'){
   title.textContent='閃光紅燈';
   desc.textContent='先停車，再確認安全後通過。';
   dot.className='status-dot stop';
   L=S=R='&#x26d4; 停車';lc=sc=rc='no';
   note.textContent='必須先停止於路口前，確認安全後才可通過。';
 } else if(state.flash && state.color==='yellow'){
   title.textContent='閃光黃燈';
   desc.textContent='減速、注意，確認安全後小心通過。';
   dot.className='status-dot warn';
   L=S=R='&#x26a0;';lc=sc=rc='caution';
   note.textContent='閃光黃燈不是「看到就加速」，應減速並注意其他車輛、行人。';
 } else if(state.flash && hasArrows){
   title.textContent='閃光箭頭綠燈（可能不只一個）';
   desc.textContent='表示該方向綠燈時段即將結束；已進入路口者可依規定續行。';
   dot.className='status-dot warn';
   ['left','straight','right'].forEach(function(name){
     setDir(name, arrows.indexOf(name)>-1, true);
   });
   note.textContent='閃光箭頭綠燈表示該方向綠燈時段即將結束，尚未進入路口者應儘量不要再進入；未亮箭頭的方向不可通行。';
 } else if(state.flash && state.color==='green'){
   title.textContent='閃光圓形綠燈';
   desc.textContent='綠燈時段即將結束，尚未進入路口者應儘量不要再進入。';
   dot.className='status-dot warn';
   L=S=R='&#x26a0;';lc=sc=rc='caution';
   note.textContent='已進入路口者可繼續通行；尚未進入路口者應儘量不要再進入。';

 // ===== 圓形綠燈：不論箭頭是否同時亮，三個方向皆可行駛 =====
 } else if(state.color==='green'){
   title.textContent = hasArrows ? '圓形綠燈＋方向箭頭' : '圓形綠燈';
   desc.textContent='圓形綠燈准許直行或左、右轉；同時亮的箭頭僅為加強指示，不會限縮方向。';
   dot.className='status-dot ok';
   L='✓ 可以';S='✓ 可以';R='✓ 可以';lc=sc=rc='yes';
   note.textContent='仍須注意轉彎車讓直行車、行人，以及現場的標誌、標線與其他交通管制。';

 // ===== 沒有圓形綠燈，但有一個以上綠色箭頭亮著（可與紅燈同時、也可單獨亮） =====
 } else if(hasArrows){
   if(state.color==='red'){
     title.textContent='紅燈＋方向箭頭（可能不只一個）';
     desc.textContent='圓形紅燈亮著，但可依已亮起的箭頭方向行駛。';
   } else if(state.color==='yellow'){
     title.textContent='黃燈＋方向箭頭';
     desc.textContent='圓形黃燈原則上應停止，但已亮起的箭頭方向仍可通行，應減速注意。';
   } else {
     title.textContent='方向箭頭號誌（可能不只一個）';
     desc.textContent='沒有圓形燈號時，僅能依已亮起的箭頭方向行駛。';
   }
   dot.className='status-dot ok';
   ['left','straight','right'].forEach(function(name){
     setDir(name, arrows.indexOf(name)>-1, false);
   });
   note.textContent='箭頭綠燈是方向性指示，可能同時亮不只一個；未亮箭頭的方向即使圓形燈是紅／黃燈或未亮，也一律禁止通行。';

 // ===== 只有圓形燈，沒有任何箭頭 =====
 } else if(state.color==='yellow'){
   title.textContent='圓形黃燈';
   desc.textContent='紅燈即將出現，原則上應停止。';
   dot.className='status-dot warn';
   L=S=R='&#x26a0; 原則停止';lc=sc=rc='caution';
   note.textContent='已超越停止線或已無法安全停車者，應依規定繼續通過，不應為了等紅燈而急煞。';
 } else if(state.color==='red'){
   title.textContent='圓形紅燈';
   desc.textContent='禁止通行，不得超越停止線進入路口。';
   dot.className='status-dot stop';
   L=S=R='✕ 禁止';lc=sc=rc='no';
   note.textContent='紅燈狀態下不能因為「路上沒車」就自行通行；除非同時有合法允許該方向的號誌指示。';
 }
 result($('leftResult'),lc,L); result($('straightResult'),sc,S); result($('rightResult'),rc,R);
}

function renderSpecial(){
 var title=$('title'),desc=$('desc'),dot=$('dot'),note=$('note');
 var sp=state.special;
 if(sp==='pedgreen'){title.textContent='綠色行人號誌';desc.textContent='行人可依行人號誌穿越道路。';dot.className='status-dot ok';note.textContent='車輛駕駛仍應依車輛號誌及相關規定，注意行人穿越。'}
 if(sp==='pedred'){title.textContent='紅色行人號誌';desc.textContent='行人禁止進入穿越道。';dot.className='status-dot stop';note.textContent='車輛仍依車輛號誌行駛，並注意行人。'}
 if(sp==='pedflash'){title.textContent='閃光行人號誌';desc.textContent='表示行人綠燈時段即將結束，應儘速通過。';dot.className='status-dot warn';note.textContent='不要在閃光階段突然進入穿越道。'}
 if(sp==='lanegreen'){title.textContent='綠色車道箭頭';desc.textContent='該車道依箭頭指示方向行駛。';dot.className='status-dot ok';note.textContent='車道管制號誌與一般紅綠燈的判讀方式不同，須依車道上方號誌行駛。'}
 if(sp==='lanered'){title.textContent='紅色 X 車道號誌';desc.textContent='該車道禁止通行。';dot.className='status-dot stop';note.textContent='應依現場其他車道號誌改道，不可駛入紅色 X 所管制的車道。'}
 if(sp==='rail'){title.textContent='鐵路平交道號誌';desc.textContent='看到紅燈閃爍、警鈴或遮斷設備動作時，應停止。';dot.className='status-dot stop';note.textContent='平交道安全優先，禁止搶越或穿越已啟動的遮斷設備。'}
 result($('leftResult'),'','—');result($('straightResult'),'','—');result($('rightResult'),'','—');
}

document.querySelectorAll('.lamp').forEach(function(el){
 el.addEventListener('click',function(){ toggleColor(el.id); });
});
document.querySelectorAll('.arrow').forEach(function(el){
 el.addEventListener('click',function(){ toggleArrow(el.getAttribute('data-arrow')); });
});
document.querySelectorAll('[data-preset]').forEach(function(el){
 el.addEventListener('click',function(){setState(presets[el.getAttribute('data-preset')])});
});
document.querySelectorAll('[data-special]').forEach(function(el){
 el.addEventListener('click',function(){
   state={color:null,arrows:{left:false,straight:false,right:false},flash:false,special:el.getAttribute('data-special')};
   ['red','yellow','green'].forEach(function(c){$(c).classList.remove('on')});
   document.querySelectorAll('.arrow').forEach(function(a){a.classList.remove('active')});
   renderSpecial();
 });
});
render();
})();
</script>
</body>
</html>



<figure class="wp-block-image size-large"><img decoding="async" src="https://imgpoi.com/i/TB0PO2.png" alt=""/></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://imgpoi.com/i/TB04KM.jpg" alt=""/></figure>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>「攝影計算」曝光轉盤-曝光計算器</title>
		<link>https://0123456789.tw/ev/</link>
		
		
		<pubDate>Sat, 15 Aug 2026 05:32:33 +0000</pubDate>
				<category><![CDATA[本站內嵌計算機]]></category>
		<category><![CDATA[攝影]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2201</guid>

					<description><![CDATA[曝光計算器 &#8211; EV / 光圈 / 快門 即時換算 ⚡ 曝光計算器 原理與圓形曝光轉盤相同：EV  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="568" height="568" src="https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-15_13.39.08.jpg" alt="" class="wp-image-2205" srcset="https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-15_13.39.08.jpg 568w, https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-15_13.39.08-300x300.jpg 300w, https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-15_13.39.08-150x150.jpg 150w" sizes="auto, (max-width: 568px) 100vw, 568px" /></figure>



<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>曝光計算器 &#8211; EV / 光圈 / 快門 即時換算</title>
<style>
  .expocalc-wrap * { box-sizing: border-box; }
  .expocalc-wrap {
    max-width: 680px;
    margin: 0 auto;
    font-family: -apple-system, "PingFang TC", "Microsoft JhengHei", sans-serif;
    color: #2c2c2c;
    padding: 16px;
    background: #f5f5f5;
  }
  .expocalc-title {
    font-size: 22px;
    font-weight: 700;
    color: #A80000;
    margin: 0 0 4px;
  }
  .expocalc-sub {
    font-size: 13px;
    color: #958E8A;
    margin: 0 0 18px;
  }
  .expocalc-card {
    background: #ffffff;
    border: 1px solid #d0d0d0;
    border-radius: 10px;
    padding: 16px;
    margin-bottom: 16px;
  }
  .expocalc-card h2 {
    font-size: 16px;
    margin: 0 0 12px;
    color: #424242;
    border-left: 4px solid #A80000;
    padding-left: 8px;
  }
  .expocalc-row {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 10px;
    align-items: center;
  }
  .expocalc-field {
    flex: 1;
    min-width: 130px;
  }
  .expocalc-field label {
    display: block;
    font-size: 12px;
    color: #958E8A;
    margin-bottom: 4px;
  }
  .expocalc-field input,
  .expocalc-field select {
    width: 100%;
    padding: 9px 10px;
    border: 1px solid #d0d0d0;
    border-radius: 6px;
    font-size: 15px;
    color: #2c2c2c;
    background: #fff;
  }
  .expocalc-btn {
    background: #A80000;
    color: #fff;
    border: none;
    padding: 10px 18px;
    border-radius: 6px;
    font-size: 15px;
    font-weight: 600;
    cursor: pointer;
    width: 100%;
  }
  .expocalc-btn:active { opacity: 0.85; }
  .expocalc-result {
    margin-top: 12px;
    background: #EEEEEE;
    border-radius: 8px;
    padding: 12px 14px;
    font-size: 14px;
    line-height: 1.6;
  }
  .expocalc-result strong { color: #A80000; font-size: 18px; }
  .expocalc-table-wrap { overflow-x: auto; }
  table.expocalc-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
    margin-top: 10px;
  }
  table.expocalc-table th, table.expocalc-table td {
    border: 1px solid #d0d0d0;
    padding: 7px 6px;
    text-align: center;
  }
  table.expocalc-table th {
    background: #424242;
    color: #fff;
    font-weight: 500;
  }
  table.expocalc-table tr:nth-child(even) td { background: #f5f5f5; }
  .expocalc-zonebar {
    display: flex;
    border-radius: 6px;
    overflow: hidden;
    margin: 10px 0 4px;
    border: 1px solid #d0d0d0;
  }
  .expocalc-zonebar span {
    flex: 1;
    text-align: center;
    font-size: 11px;
    padding: 6px 0;
    color: #fff;
    cursor: pointer;
    user-select: none;
  }
  .expocalc-zonebar span.active {
    outline: 2px solid #A80000;
    outline-offset: -2px;
    font-weight: 700;
  }
  .expocalc-note {
    font-size: 12px;
    color: #958E8A;
    margin-top: 8px;
    line-height: 1.6;
  }
  .expocalc-hint {
    font-size: 12px;
    color: #A80000;
    margin-top: 4px;
  }
</style>
</head>
<body>

<div class="expocalc-wrap" id="expocalcRoot">
  <div class="expocalc-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 曝光計算器</div>
  <div class="expocalc-sub">原理與圓形曝光轉盤相同：EV = log₂(光圈² ÷ 快門秒數)，只是把「對齊刻度」換成「直接輸入」</div>

  <!-- 區塊一：EV -> 光圈/快門對照表，並支援 Zone System 偏移 -->
  <div class="expocalc-card">
    <h2>從點測光表 EV 值查完整光圈／快門對照表</h2>
    <div class="expocalc-row">
      <div class="expocalc-field">
        <label>測光表讀數 EV</label>
        <input type="number" id="expocalcEvInput" step="0.1" placeholder="例如 10">
      </div>
      <div class="expocalc-field">
        <label>ISO（僅供記錄，需與測光表一致）</label>
        <input type="number" id="expocalcIsoInput" step="1" placeholder="例如 100">
      </div>
    </div>

    <label style="display:block;font-size:12px;color:#958E8A;margin-bottom:4px;">
      Zone System 影調偏移（預設 V = 中間灰，不調整）
    </label>
    <div class="expocalc-zonebar" id="expocalcZonebar"></div>
    <div class="expocalc-hint" id="expocalcZoneDesc"></div>

    <div class="expocalc-row" style="margin-top:12px;">
      <button class="expocalc-btn" data-action="calc-table">計算並產生對照表</button>
    </div>

    <div class="expocalc-result" id="expocalcTableResult" style="display:none;"></div>
  </div>

  <!-- 區塊二：已知光圈+快門，反推 EV -->
  <div class="expocalc-card">
    <h2>已知光圈 + 快門，反推 EV 值</h2>
    <div class="expocalc-row">
      <div class="expocalc-field">
        <label>光圈 f/</label>
        <select id="expocalcApertureSelect"></select>
      </div>
      <div class="expocalc-field">
        <label>快門</label>
        <select id="expocalcShutterSelect"></select>
      </div>
    </div>
    <button class="expocalc-btn" data-action="calc-ev">計算 EV</button>
    <div class="expocalc-result" id="expocalcEvResult" style="display:none;"></div>
  </div>

  <div class="expocalc-note">
    說明：EV（曝光值）只由光圈與快門的組合決定，測光表在讀取當下已經把 ISO 換算進 EV 裡，所以查表時不需要再套一次 ISO；ISO 欄位只是方便您核對相機與測光表設定是否一致。若把某個高光點測光後想放在 Zone VIII（比 Zone V 亮 3 級），代表需要比表列數值再增加 3 級曝光量，本工具已自動處理這個偏移計算。
  </div>
</div>

<script>
(function () {
  'use strict';

  var APERTURES = [1, 1.4, 2, 2.8, 4, 5.6, 8, 11, 16, 22, 32];
  var SHUTTERS = [
    { label: '1/4000', sec: 1/4000 }, { label: '1/2000', sec: 1/2000 },
    { label: '1/1000', sec: 1/1000 }, { label: '1/500', sec: 1/500 },
    { label: '1/250', sec: 1/250 }, { label: '1/125', sec: 1/125 },
    { label: '1/60', sec: 1/60 }, { label: '1/30', sec: 1/30 },
    { label: '1/15', sec: 1/15 }, { label: '1/8', sec: 1/8 },
    { label: '1/4', sec: 1/4 }, { label: '1/2', sec: 1/2 },
    { label: '1"', sec: 1 }, { label: '2"', sec: 2 },
    { label: '4"', sec: 4 }, { label: '8"', sec: 8 },
    { label: '15"', sec: 15 }, { label: '30"', sec: 30 }
  ];

  var ZONES = [
    { v: 0, label: '0', desc: '全黑，無任何細節' },
    { v: 1, label: 'I', desc: '接近全黑，僅隱約可見紋理' },
    { v: 2, label: 'II', desc: '最暗但仍保有紋理的暗部' },
    { v: 3, label: 'III', desc: '暗部細節清楚可辨' },
    { v: 4, label: 'IV', desc: '中暗色調（如深色皮膚、陰影）' },
    { v: 5, label: 'V', desc: '中間灰 18%（測光表預設基準）' },
    { v: 6, label: 'VI', desc: '中亮色調（如一般膚色）' },
    { v: 7, label: 'VII', desc: '亮部，紋理仍清楚' },
    { v: 8, label: 'VIII', desc: '最亮但仍保有紋理的亮部' },
    { v: 9, label: 'IX', desc: '接近全白，僅隱約可見紋理' },
    { v: 10, label: 'X', desc: '全白，無任何細節（純白反光）' }
  ];

  var STORAGE_KEY = 'expocalc_last_state';
  var selectedZone = 5;

  function zoneColor(v) {
    var pct = Math.round((v / 10) * 200); // 0~200 gray value
    var g = Math.min(230, Math.max(15, pct));
    return 'rgb(' + g + ',' + g + ',' + g + ')';
  }

  function formatShutterFromSeconds(t) {
    if (t <= 0 || !isFinite(t)) return '--';
    if (t >= 1) {
      var whole = t >= 10 ? Math.round(t) : Math.round(t * 10) / 10;
      return whole + '"';
    }
    var denom = Math.round(1 / t);
    return '1/' + denom;
  }

  function calcEV(aperture, shutterSec) {
    return Math.log2((aperture * aperture) / shutterSec);
  }

  function buildZonebar() {
    var bar = document.getElementById('expocalcZonebar');
    var html = '';
    for (var i = 0; i < ZONES.length; i++) {
      var z = ZONES[i];
      var cls = (z.v === selectedZone) ? 'active' : '';
      html += '<span class="' + cls + '" style="background:' + zoneColor(z.v) + ';color:' + (z.v <= 4 ? '#fff' : '#2c2c2c') + '" data-action="pick-zone" data-zone="' + z.v + '">' + z.label + '</span>';
    }
    bar.innerHTML = html;
    updateZoneDesc();
  }

  function updateZoneDesc() {
    var z = ZONES[selectedZone];
    var offset = z.v - 5;
    var offsetText = offset === 0 ? '不需偏移（等同直接使用測光表讀數）' :
      (offset > 0 ? '需增加 ' + offset + ' 級曝光（EV 需 -' + offset + '）' : '需減少 ' + Math.abs(offset) + ' 級曝光（EV 需 +' + Math.abs(offset) + '）');
    document.getElementById('expocalcZoneDesc').textContent =
      'Zone ' + z.label + '：' + z.desc + '　｜　' + offsetText;
  }

  function buildSelectOptions() {
    var apSel = document.getElementById('expocalcApertureSelect');
    var shSel = document.getElementById('expocalcShutterSelect');
    var apHtml = '', shHtml = '';
    var i;
    for (i = 0; i < APERTURES.length; i++) {
      apHtml += '<option value="' + APERTURES[i] + '"' + (APERTURES[i] === 5.6 ? ' selected' : '') + '>f/' + APERTURES[i] + '</option>';
    }
    for (i = 0; i < SHUTTERS.length; i++) {
      shHtml += '<option value="' + SHUTTERS[i].sec + '"' + (SHUTTERS[i].label === '1/125' ? ' selected' : '') + '>' + SHUTTERS[i].label + '</option>';
    }
    apSel.innerHTML = apHtml;
    shSel.innerHTML = shHtml;
  }

  function renderTable(adjustedEV, meteredEV, zoneLabel, offset) {
    var rows = '';
    for (var i = 0; i < APERTURES.length; i++) {
      var n = APERTURES[i];
      var t = (n * n) / Math.pow(2, adjustedEV);
      rows += '<tr><td>f/' + n + '</td><td>' + formatShutterFromSeconds(t) + '</td></tr>';
    }

    var offsetLine = offset === 0
      ? ''
      : '（已套用 Zone ' + zoneLabel + ' 偏移 ' + (offset > 0 ? '-' : '+') + Math.abs(offset) + ' 級）';

    var html =
      '<div>測光表讀數 EV = <strong>' + meteredEV.toFixed(1) + '</strong>　→　實際計算用 EV = <strong>' + adjustedEV.toFixed(1) + '</strong> ' + offsetLine + '</div>' +
      '<div class="expocalc-table-wrap"><table class="expocalc-table"><thead><tr><th>光圈 f/</th><th>對應快門</th></tr></thead><tbody>' +
      rows + '</tbody></table></div>';

    var resultBox = document.getElementById('expocalcTableResult');
    resultBox.innerHTML = html;
    resultBox.style.display = 'block';
  }

  function saveState(ev, iso) {
    try {
      localStorage.setItem(STORAGE_KEY, JSON.stringify({ ev: ev, iso: iso, zone: selectedZone }));
    } catch (e) { /* localStorage unavailable, ignore */ }
  }

  function loadState() {
    try {
      var raw = localStorage.getItem(STORAGE_KEY);
      if (!raw) return;
      var state = JSON.parse(raw);
      if (state.ev !== undefined) document.getElementById('expocalcEvInput').value = state.ev;
      if (state.iso !== undefined) document.getElementById('expocalcIsoInput').value = state.iso;
      if (state.zone !== undefined) selectedZone = state.zone;
    } catch (e) { /* ignore malformed data */ }
  }

  function handleCalcTable() {
    var evInput = document.getElementById('expocalcEvInput');
    var isoInput = document.getElementById('expocalcIsoInput');
    var meteredEV = parseFloat(evInput.value);

    if (isNaN(meteredEV)) {
      evInput.focus();
      var resultBox = document.getElementById('expocalcTableResult');
      resultBox.innerHTML = '<span style="color:#A80000;">請先輸入測光表讀數 EV 值</span>';
      resultBox.style.display = 'block';
      return;
    }

    var offset = selectedZone - 5;
    var adjustedEV = meteredEV - offset;
    var zoneLabel = ZONES[selectedZone].label;

    renderTable(adjustedEV, meteredEV, zoneLabel, offset);
    saveState(meteredEV, isoInput.value);
  }

  function handleCalcEV() {
    var aperture = parseFloat(document.getElementById('expocalcApertureSelect').value);
    var shutterSec = parseFloat(document.getElementById('expocalcShutterSelect').value);
    var ev = calcEV(aperture, shutterSec);

    var resultBox = document.getElementById('expocalcEvResult');
    resultBox.innerHTML =
      '光圈 f/' + aperture + '　+　快門 ' + formatShutterFromSeconds(shutterSec) +
      '　→　EV = <strong>' + ev.toFixed(2) + '</strong>';
    resultBox.style.display = 'block';
  }

  function handleClick(e) {
    var el = e.target.closest('[data-action]');
    if (!el) return;
    var action = el.getAttribute('data-action');

    if (action === 'calc-table') {
      handleCalcTable();
    } else if (action === 'calc-ev') {
      handleCalcEV();
    } else if (action === 'pick-zone') {
      selectedZone = parseInt(el.getAttribute('data-zone'), 10);
      buildZonebar();
    }
  }

  function init() {
    buildSelectOptions();
    loadState();
    buildZonebar();
    document.getElementById('expocalcRoot').addEventListener('click', handleClick);
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();
</script>

</body>
</html>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>打七折最高折200，需要買多少剛好最高計算機</title>
		<link>https://0123456789.tw/7-200/</link>
		
		
		<pubDate>Fri, 14 Aug 2026 07:52:53 +0000</pubDate>
				<category><![CDATA[計算blog文]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2196</guid>

					<description><![CDATA[最高折價優惠計算機｜折扣上限甜蜜點試算 最高折價優惠計算機 輸入折扣與封頂金額，算出最划算的消費金額 打幾折  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>最高折價優惠計算機｜折扣上限甜蜜點試算</title>
<style>
  * { box-sizing: border-box; margin: 0; padding: 0; }
  body {
    font-family: -apple-system, BlinkMacSystemFont, "Microsoft JhengHei", "PingFang TC", sans-serif;
    background: #f5f5f5;
    color: #2c2c2c;
    padding: 20px;
    line-height: 1.6;
  }
  .dcc-wrap {
    max-width: 480px;
    margin: 0 auto;
  }
  .dcc-header {
    text-align: center;
    margin-bottom: 20px;
  }
  .dcc-header h1 {
    font-size: 22px;
    color: #2c2c2c;
  }
  .dcc-header p {
    font-size: 13px;
    color: #958E8A;
    margin-top: 4px;
  }
  .dcc-card {
    background: #EEEEEE;
    border-radius: 12px;
    padding: 20px;
    margin-bottom: 16px;
  }
  .dcc-field {
    margin-bottom: 14px;
  }
  .dcc-field:last-child { margin-bottom: 0; }
  .dcc-label {
    display: block;
    font-size: 13px;
    color: #424242;
    margin-bottom: 6px;
    font-weight: bold;
  }
  .dcc-input-row {
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .dcc-input {
    flex: 1;
    padding: 10px 12px;
    border: 1px solid #d0d0d0;
    border-radius: 8px;
    font-size: 16px;
    background: #fff;
    color: #2c2c2c;
  }
  .dcc-input:focus {
    outline: none;
    border-color: #A80000;
  }
  .dcc-unit {
    font-size: 14px;
    color: #958E8A;
    white-space: nowrap;
  }
  .dcc-result {
    background: #2c2c2c;
    border-radius: 12px;
    padding: 20px;
    text-align: center;
    color: #EEEEEE;
    margin-bottom: 16px;
  }
  .dcc-result-label {
    font-size: 13px;
    color: #d0d0d0;
    margin-bottom: 6px;
  }
  .dcc-result-value {
    font-size: 32px;
    font-weight: bold;
    color: #EEEEEE;
  }
  .dcc-result-sub {
    font-size: 12px;
    color: #958E8A;
    margin-top: 8px;
  }
  .dcc-check-title {
    font-size: 14px;
    font-weight: bold;
    color: #424242;
    margin-bottom: 10px;
  }
  .dcc-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
  }
  .dcc-table th, .dcc-table td {
    padding: 8px 6px;
    text-align: center;
    border-bottom: 1px solid #d0d0d0;
  }
  .dcc-table th {
    color: #958E8A;
    font-weight: normal;
    font-size: 12px;
  }
  .dcc-table td {
    color: #2c2c2c;
  }
  .dcc-table .dcc-best {
    color: #A80000;
    font-weight: bold;
  }
  .dcc-error {
    color: #A80000;
    font-size: 13px;
    text-align: center;
    padding: 8px 0;
  }
  .dcc-note {
    font-size: 12px;
    color: #958E8A;
    text-align: center;
    margin-top: 10px;
  }
</style>
</head>
<body>
<div class="dcc-wrap">
  <div class="dcc-header">
    <h1>最高折價優惠計算機</h1>
    <p>輸入折扣與封頂金額，算出最划算的消費金額</p>
  </div>

  <div class="dcc-card">
    <div class="dcc-field">
      <label class="dcc-label">打幾折</label>
      <div class="dcc-input-row">
        <input type="number" class="dcc-input" id="dcc-percent" placeholder="例如：7" step="0.1" min="0.1" max="9.9">
        <span class="dcc-unit">折（付原價的幾成）</span>
      </div>
    </div>
    <div class="dcc-field">
      <label class="dcc-label">最高折抵金額</label>
      <div class="dcc-input-row">
        <input type="number" class="dcc-input" id="dcc-cap" placeholder="例如：200" min="1">
        <span class="dcc-unit">元</span>
      </div>
    </div>
  </div>

  <div id="dcc-result-area"></div>

  <div class="dcc-card" id="dcc-check-card" style="display:none;">
    <div class="dcc-check-title">花費金額對照表</div>
    <table class="dcc-table" id="dcc-table"></table>
  </div>

  <div class="dcc-note">甜蜜點＝最高折抵金額 ÷ 折扣比例，超過此金額折扣不再增加</div>
</div>

<script>
(function () {
  "use strict";

  var percentInput = document.getElementById("dcc-percent");
  var capInput = document.getElementById("dcc-cap");
  var resultArea = document.getElementById("dcc-result-area");
  var checkCard = document.getElementById("dcc-check-card");
  var tableEl = document.getElementById("dcc-table");

  var STORAGE_KEY = "dcc_last_input";

  function loadSaved() {
    try {
      var raw = localStorage.getItem(STORAGE_KEY);
      if (!raw) return;
      var data = JSON.parse(raw);
      if (data.percent) percentInput.value = data.percent;
      if (data.cap) capInput.value = data.cap;
    } catch (e) {}
  }

  function saveInput() {
    try {
      localStorage.setItem(STORAGE_KEY, JSON.stringify({
        percent: percentInput.value,
        cap: capInput.value
      }));
    } catch (e) {}
  }

  function formatNumber(n) {
    return Math.round(n).toLocaleString("zh-Hant-TW");
  }

  function calc() {
    var percent = parseFloat(percentInput.value);
    var cap = parseFloat(capInput.value);

    if (!percent || !cap || percent <= 0 || percent >= 10 || cap <= 0) {
      resultArea.innerHTML = '<div class="dcc-card"><div class="dcc-error">請輸入正確的折數（0.1～9.9）與折抵上限金額</div></div>';
      checkCard.style.display = "none";
      return;
    }

    var discountRate = (10 - percent) / 10; // 折扣比例，例如打7折 = 折30%
    var breakeven = cap / discountRate;

    resultArea.innerHTML =
      '<div class="dcc-result">' +
        '<div class="dcc-result-label">花到這個金額最划算（折扣剛好封頂）</div>' +
        '<div class="dcc-result-value">約 ' + formatNumber(breakeven) + ' 元</div>' +
        '<div class="dcc-result-sub">折扣比例：' + (discountRate * 100).toFixed(1) + '%　｜　封頂折抵：' + formatNumber(cap) + ' 元</div>' +
      '</div>';

    renderTable(breakeven, discountRate, cap);
    checkCard.style.display = "block";
    saveInput();
  }

  function renderTable(breakeven, discountRate, cap) {
    var amounts = [];
    var base = breakeven;
    var steps = [-0.4, -0.2, 0, 0.2, 0.5];
    for (var i = 0; i < steps.length; i++) {
      var amt = Math.max(0, base * (1 + steps[i]));
      amounts.push(amt);
    }

    var html = '<tr><th>花費金額</th><th>折扣金額</th><th>實付金額</th></tr>';
    for (var j = 0; j < amounts.length; j++) {
      var spend = amounts[j];
      var discount = Math.min(spend * discountRate, cap);
      var actualPay = spend - discount;
      var isBest = Math.abs(spend - breakeven) < 0.01 || j === 2;
      var rowClass = isBest ? ' class="dcc-best"' : '';
      html += '<tr>' +
        '<td' + rowClass + '>' + formatNumber(spend) + '</td>' +
        '<td' + rowClass + '>' + formatNumber(discount) + '</td>' +
        '<td' + rowClass + '>' + formatNumber(actualPay) + '</td>' +
        '</tr>';
    }
    tableEl.innerHTML = html;
  }

  percentInput.addEventListener("input", calc);
  capInput.addEventListener("input", calc);

  loadSaved();
  calc();
})();
</script>
</body>
</html>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="407" height="896" src="https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-14_15.48.39.jpg" alt="" class="wp-image-2199" srcset="https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-14_15.48.39.jpg 407w, https://0123456789.tw/wp-content/uploads/2026/08/iShot_2026-08-14_15.48.39-136x300.jpg 136w" sizes="auto, (max-width: 407px) 100vw, 407px" /></figure>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>可開始訂票日期計算器（台鐵高鐵.自訂搶票）</title>
		<link>https://0123456789.tw/ticketday/</link>
		
		
		<pubDate>Wed, 12 Aug 2026 05:55:29 +0000</pubDate>
				<category><![CDATA[本站內嵌計算機]]></category>
		<category><![CDATA[台鐵]]></category>
		<category><![CDATA[月曆]]></category>
		<category><![CDATA[訂票]]></category>
		<category><![CDATA[計算]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2193</guid>

					<description><![CDATA[台鐵訂票日期計算器 輸入您想搭乘的日期，立即算出台鐵對號列車的「開賣日期與時間」，並在月曆上標示乘車日與可開始 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<!-- 台鐵訂票日期計算器 | 可直接貼入 WordPress 自訂 HTML 區塊 -->
<div class="tccal-container">
  <div class="tccal-card">
    <h2 class="tccal-title">台鐵訂票日期計算器</h2>
    <p class="tccal-desc">輸入您想搭乘的日期，立即算出台鐵對號列車的「開賣日期與時間」，並在月曆上標示乘車日與可開始訂票日。</p>

    <div class="tccal-input-wrapper">
      <label class="tccal-label" for="">乘車日期</label>
      <input type="date" class="tccal-input" data-role="dateInput" />

      <div class="tccal-options">
        <label class="tccal-checklabel">
          <input type="checkbox" data-role="puyumaCheck" />
          普悠瑪號桌型座位車廂
        </label>
        <label class="tccal-checklabel">
          <input type="checkbox" data-role="localCheck" />
          非對號列車（區間車等）
        </label>
      </div>

      <button type="button" class="tccal-btn" data-action="calc">計算開賣日期</button>
    </div>

    <div class="tccal-result" data-role="result" hidden></div>

    <div class="tccal-calendar-wrapper" data-role="calendarWrapper" hidden>
      <div class="tccal-cal-nav">
        <button type="button" class="tccal-navbtn" data-action="nav" data-dir="-1" aria-label="上個月">‹</button>
        <span class="tccal-monthlabel" data-role="monthLabel"></span>
        <button type="button" class="tccal-navbtn" data-action="nav" data-dir="1" aria-label="下個月">›</button>
      </div>
      <div class="tccal-cal-jump">
        <button type="button" class="tccal-jumpbtn" data-action="jump-opening">跳至開賣月</button>
        <button type="button" class="tccal-jumpbtn" data-action="jump-travel">跳至乘車月</button>
        <button type="button" class="tccal-jumpbtn" data-action="jump-today">回到今天</button>
      </div>

      <div class="tccal-weekrow">
        <span>日</span><span>一</span><span>二</span><span>三</span><span>四</span><span>五</span><span>六</span>
      </div>
      <div class="tccal-grid" data-role="grid"></div>

      <div class="tccal-legend">
        <span class="tccal-legend-item"><i class="tccal-swatch tccal-swatch-opening"></i>可開始訂票日</span>
        <span class="tccal-legend-item"><i class="tccal-swatch tccal-swatch-travel"></i>乘車日</span>
        <span class="tccal-legend-item"><i class="tccal-swatch tccal-swatch-today"></i>今天</span>
        <span class="tccal-legend-item tccal-legend-puyuma" data-role="legendPuyuma" hidden><i class="tccal-swatch tccal-swatch-puyuma"></i>普悠瑪桌型座位限購放寬日</span>
      </div>
    </div>

    <div class="tccal-notes">
      <h3 class="tccal-notes-title">訂票規則說明</h3>
      <ul class="tccal-notes-list">
        <li><strong>一般規則：</strong>對號列車開放乘車前 28 天（4 週）起預訂，最晚可訂至開車前 30 分鐘以上。</li>
        <li><strong>週五加開：</strong>每逢週五，會一併多開放兩天，即最多可訂到「四週後的週五、週六、週日」三天車票，讓週六、週日的車票提前一起開賣。</li>
        <li><strong>開放時間：</strong>網路 / App /語音訂票 / 超商，於開放當日 <strong>凌晨 00:00</strong> 開賣；車站售票窗口則於 <strong>上午 09:00</strong> 同步開賣。</li>
        <li><strong>連續假期 / 春節疏運：</strong>疏運期間開賣日由台鐵另行公告，不適用上述 28 天一般規則，請以台鐵官網公告為準。</li>
        <li><strong>普悠瑪桌型座位：</strong>乘車日前 7 天以上，每次限購 4 張或 8 張；乘車日前 7 天以內（含當日）開放單張（1～9 張）零星訂購。</li>
        <li><strong>非對號列車（區間車等）：</strong>不開放事前預訂，請直接至車站購票或以票卡刷卡進出站。</li>
      </ul>
    </div>
  </div>
</div>

<style>
.tccal-container{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang TC","Microsoft JhengHei",sans-serif;color:#424242;font-size:1.05rem;line-height:1.7;box-sizing:border-box}
.tccal-container *,.tccal-container *:before,.tccal-container *:after{box-sizing:border-box}
.tccal-card{background:#ffffff;border:1px solid #d0d0d0;border-radius:12px;padding:32px;max-width:720px;margin:0 auto}
.tccal-title{font-size:2rem;font-weight:700;color:#2c2c2c;margin:0 0 8px}
.tccal-desc{color:#958E8A;margin:0 0 24px;font-size:1.05rem}

.tccal-input-wrapper{max-width:50%;margin:0 auto 24px;text-align:left}
@media (max-width:640px){.tccal-input-wrapper{max-width:100%}}

.tccal-label{display:block;font-weight:600;color:#2c2c2c;margin-bottom:6px;font-size:.95rem}
.tccal-input{width:100%;padding:10px 12px;border:1px solid #d0d0d0;border-radius:8px;font-size:1.05rem;color:#2c2c2c;background:#f5f5f5}
.tccal-input:focus{outline:2px solid #A80000;outline-offset:1px;background:#fff}

.tccal-options{margin:14px 0;display:flex;flex-direction:column;gap:8px}
.tccal-checklabel{display:flex;align-items:center;gap:8px;font-size:.92rem;color:#424242;cursor:pointer}
.tccal-checklabel input{width:16px;height:16px;accent-color:#A80000;cursor:pointer}

.tccal-btn{display:block;width:100%;margin-top:16px;padding:12px 20px;background:#A80000;color:#EEEEEE;border:none;border-radius:8px;font-size:1.05rem;font-weight:600;cursor:pointer;transition:background .15s ease}
.tccal-btn:hover{background:#8a0000}
.tccal-btn:active{background:#700000}

.tccal-result{max-width:640px;margin:0 auto 24px;background:#f5f5f5;border:1px solid #d0d0d0;border-radius:10px;padding:20px}
.tccal-result-headline{font-size:1.2rem;font-weight:700;color:#2c2c2c;margin:0 0 8px}
.tccal-result-headline.tccal-status-open{color:#A80000}
.tccal-result-row{margin:4px 0;font-size:.98rem;color:#424242}
.tccal-result-row strong{color:#2c2c2c}
.tccal-result-warn{margin-top:10px;padding:10px 12px;background:#EEEEEE;border-left:3px solid #A80000;border-radius:4px;font-size:.9rem;color:#424242}

.tccal-calendar-wrapper{max-width:640px;margin:0 auto 28px}
.tccal-cal-nav{display:flex;align-items:center;justify-content:center;gap:16px;margin-bottom:10px}
.tccal-navbtn{background:#EEEEEE;border:1px solid #d0d0d0;color:#2c2c2c;width:34px;height:34px;border-radius:50%;font-size:1.1rem;cursor:pointer;line-height:1}
.tccal-navbtn:hover{background:#d0d0d0}
.tccal-monthlabel{font-weight:700;font-size:1.1rem;color:#2c2c2c;min-width:130px;text-align:center}

.tccal-cal-jump{display:flex;justify-content:center;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.tccal-jumpbtn{background:#fff;border:1px solid #d0d0d0;color:#424242;padding:5px 12px;border-radius:16px;font-size:.82rem;cursor:pointer}
.tccal-jumpbtn:hover{border-color:#A80000;color:#A80000}

.tccal-weekrow{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-size:.85rem;color:#958E8A;margin-bottom:4px}
.tccal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}

.tccal-day{position:relative;aspect-ratio:1/1;border:1px solid #EEEEEE;border-radius:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:.85rem;color:#424242;background:#fff;gap:2px}
.tccal-day.is-other-month{color:#d0d0d0;background:#f9f9f9}
.tccal-day .tccal-daynum{font-size:.95rem}
.tccal-day.is-today{border:2px solid #424242}
.tccal-day.is-opening{background:#A80000;color:#fff;border-color:#A80000}
.tccal-day.is-opening .tccal-daynum{color:#fff;font-weight:700}
.tccal-day.is-travel{background:#EEEEEE;border:2px solid #A80000}
.tccal-day.is-travel .tccal-daynum{color:#A80000;font-weight:700}
.tccal-day.is-travel.is-opening{background:linear-gradient(135deg,#A80000 50%,#EEEEEE 50%)}
.tccal-day-tag{font-size:.62rem;letter-spacing:.02em}
.tccal-day.is-opening .tccal-day-tag{color:#EEEEEE}
.tccal-day.is-travel .tccal-day-tag{color:#A80000}
.tccal-puyuma-dot{position:absolute;bottom:4px;right:4px;width:6px;height:6px;border-radius:50%;background:#958E8A}

.tccal-legend{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;margin-top:16px;font-size:.82rem;color:#424242}
.tccal-legend-item{display:flex;align-items:center;gap:6px}
.tccal-swatch{display:inline-block;width:12px;height:12px;border-radius:3px}
.tccal-swatch-opening{background:#A80000}
.tccal-swatch-travel{background:#EEEEEE;border:2px solid #A80000}
.tccal-swatch-today{background:#fff;border:2px solid #424242}
.tccal-swatch-puyuma{background:#958E8A;border-radius:50%}

.tccal-notes{max-width:640px;margin:0 auto;border-top:1px solid #d0d0d0;padding-top:20px}
.tccal-notes-title{font-size:1.1rem;color:#2c2c2c;margin:0 0 10px}
.tccal-notes-list{margin:0;padding-left:20px;font-size:.92rem;color:#424242}
.tccal-notes-list li{margin-bottom:8px}
</style>

<script>
(function(){
  'use strict';

  var WEEKDAY_NAMES = ['日','一','二','三','四','五','六'];
  var MS_DAY = 86400000;

  function pad(n){ return (n < 10 ? '0' : '') + n; }

  function dateKey(d){ return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); }

  function stripTime(d){ return new Date(d.getFullYear(), d.getMonth(), d.getDate()); }

  function addDays(d, n){
    var r = new Date(d.getTime());
    r.setDate(r.getDate() + n);
    return r;
  }

  function parseInputDate(str){
    // str is "YYYY-MM-DD" from <input type="date">
    var parts = str.split('-');
    if(parts.length !== 3){ return null; }
    var y = parseInt(parts[0], 10), m = parseInt(parts[1], 10), d = parseInt(parts[2], 10);
    if(isNaN(y) || isNaN(m) || isNaN(d)){ return null; }
    return new Date(y, m - 1, d);
  }

  function formatDate(d){
    return d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日（' + WEEKDAY_NAMES[d.getDay()] + '）';
  }

  // 核心規則：
  // 一般開賣日 O = 乘車日 - 28 天。
  // 因每逢週五加開週末兩天，若 O 落在週六，實際開賣日提前 1 天（週五）；
  // 若 O 落在週日，實際開賣日提前 2 天（週五）。
  function computeOpening(travelDate){
    var rawO = addDays(travelDate, -28);
    var wd = rawO.getDay();
    var opening = rawO;
    var bundled = false;
    if(wd === 6){ opening = addDays(rawO, -1); bundled = true; }
    else if(wd === 0){ opening = addDays(rawO, -2); bundled = true; }
    return { opening: opening, rawOpening: rawO, bundled: bundled };
  }

  function init(container){
    var dateInput = container.querySelector('[data-role="dateInput"]');
    var puyumaCheck = container.querySelector('[data-role="puyumaCheck"]');
    var localCheck = container.querySelector('[data-role="localCheck"]');
    var resultEl = container.querySelector('[data-role="result"]');
    var calWrapper = container.querySelector('[data-role="calendarWrapper"]');
    var gridEl = container.querySelector('[data-role="grid"]');
    var monthLabelEl = container.querySelector('[data-role="monthLabel"]');
    var legendPuyuma = container.querySelector('[data-role="legendPuyuma"]');

    var today = stripTime(new Date());

    var state = {
      travelDate: null,
      opening: null,
      puyumaCutoff: null,
      viewYear: today.getFullYear(),
      viewMonth: today.getMonth()
    };

    // 還原上次輸入
    try {
      var saved = localStorage.getItem('tccal_last_date');
      if(saved){ dateInput.value = saved; }
    } catch(e){ /* localStorage 不可用時略過 */ }

    function setView(d){
      state.viewYear = d.getFullYear();
      state.viewMonth = d.getMonth();
      renderGrid();
    }

    function renderGrid(){
      var y = state.viewYear, m = state.viewMonth;
      monthLabelEl.textContent = y + ' 年 ' + (m + 1) + ' 月';

      var firstOfMonth = new Date(y, m, 1);
      var startOffset = firstOfMonth.getDay(); // 0=Sun
      var gridStart = addDays(firstOfMonth, -startOffset);

      var openingKey = state.opening ? dateKey(state.opening) : null;
      var travelKey = state.travelDate ? dateKey(state.travelDate) : null;
      var todayKey = dateKey(today);
      var puyumaKey = state.puyumaCutoff ? dateKey(state.puyumaCutoff) : null;

      var html = '';
      var cursor = gridStart;
      for(var i = 0; i < 42; i++){
        var isOtherMonth = cursor.getMonth() !== m;
        var key = dateKey(cursor);
        var classes = ['tccal-day'];
        var tags = '';
        if(isOtherMonth){ classes.push('is-other-month'); }
        if(key === todayKey){ classes.push('is-today'); }
        if(key === openingKey){ classes.push('is-opening'); tags += '<span class="tccal-day-tag">開賣</span>'; }
        if(key === travelKey){ classes.push('is-travel'); tags += '<span class="tccal-day-tag">乘車</span>'; }
        var puyumaDot = (key === puyumaKey) ? '<span class="tccal-puyuma-dot" title="普悠瑪桌型座位限購放寬"></span>' : '';

        html += '<div class="' + classes.join(' ') + '" data-date="' + key + '">' +
                  '<span class="tccal-daynum">' + cursor.getDate() + '</span>' +
                  tags + puyumaDot +
                '</div>';
        cursor = addDays(cursor, 1);
      }
      gridEl.innerHTML = html;
    }

    function renderResult(){
      var localMode = localCheck.checked;
      var puyumaMode = puyumaCheck.checked;

      if(localMode){
        resultEl.hidden = false;
        calWrapper.hidden = true;
        resultEl.innerHTML =
          '<p class="tccal-result-headline">非對號列車不開放預售</p>' +
          '<p class="tccal-result-row">區間車等非對號列車沒有事先訂票制度，請直接至車站購票或使用票卡（如悠遊卡、一卡通）刷卡進出站搭乘。</p>';
        return;
      }

      if(!state.travelDate){ return; }

      var travelDate = state.travelDate;
      var isPast = travelDate.getTime() < today.getTime();

      var html = '';

      if(isPast){
        html += '<p class="tccal-result-headline">此日期已經過去</p>' +
                '<p class="tccal-result-row">請重新選擇今天（' + formatDate(today) + '）以後的乘車日期。</p>';
        resultEl.innerHTML = html;
        resultEl.hidden = false;
        calWrapper.hidden = true;
        return;
      }

      var calc = computeOpening(travelDate);
      state.opening = calc.opening;

      var diffDays = Math.round((calc.opening.getTime() - today.getTime()) / MS_DAY);
      var isOpenNow = diffDays <= 0;

      html += '<p class="tccal-result-headline' + (isOpenNow ? ' tccal-status-open' : '') + '">' +
                (isOpenNow ? '&#x2705; 這天的車票已經開放訂購' : '&#x23f3; 尚未開賣，還要等 ' + diffDays + ' 天') +
              '</p>';
      html += '<p class="tccal-result-row"><strong>乘車日期：</strong>' + formatDate(travelDate) + '</p>';
      html += '<p class="tccal-result-row"><strong>可開始訂票日：</strong>' + formatDate(calc.opening) + '</p>';
      html += '<p class="tccal-result-row"><strong>開賣時間：</strong>網路 / App / 語音 / 超商 於當日 00:00 起；車站窗口於當日 09:00 起。</p>';

      if(calc.bundled){
        html += '<p class="tccal-result-row">因乘車日往前推 28 天恰好落在週' + WEEKDAY_NAMES[calc.rawOpening.getDay()] + '，依台鐵「週五加開」規則，該週票券已隨週五一併開賣，故開賣日提前為 ' + formatDate(calc.opening) + '。</p>';
      }

      if(travelDate.getTime() === today.getTime()){
        html += '<div class="tccal-result-warn">今天正是乘車日，仍需於開車前 30 分鐘以上完成購票。</div>';
      }

      if(puyumaMode){
        var cutoff = addDays(travelDate, -7);
        state.puyumaCutoff = cutoff;
        legendPuyuma.hidden = false;
        html += '<div class="tccal-result-warn">普悠瑪號桌型座位：' + formatDate(cutoff) + '（乘車前 7 天）以前，每次限購 4 張或 8 張；' + formatDate(cutoff) + ' 起（含乘車當日）開放單張 1～9 張零星訂購。</div>';
      } else {
        state.puyumaCutoff = null;
        legendPuyuma.hidden = true;
      }

      html += '<div class="tccal-result-warn">若乘車日落在國定連續假期或春節疏運期間，開賣日將由台鐵另行公告，不適用上述 28 天一般規則，請以台鐵官網公告為準。</div>';

      resultEl.innerHTML = html;
      resultEl.hidden = false;
      calWrapper.hidden = false;

      setView(calc.opening);
    }

    function handleCalc(){
      var val = dateInput.value;
      if(!val){
        resultEl.hidden = false;
        calWrapper.hidden = true;
        resultEl.innerHTML = '<p class="tccal-result-headline">請先選擇乘車日期</p>';
        return;
      }
      var d = parseInputDate(val);
      if(!d){ return; }
      state.travelDate = stripTime(d);

      try { localStorage.setItem('tccal_last_date', val); } catch(e){ /* 略過 */ }

      renderResult();
    }

    container.addEventListener('click', function(evt){
      var target = evt.target.closest ? evt.target.closest('[data-action]') : null;
      if(!target){ return; }
      var action = target.getAttribute('data-action');

      if(action === 'calc'){
        handleCalc();
      } else if(action === 'nav'){
        var dir = parseInt(target.getAttribute('data-dir'), 10);
        var newDate = new Date(state.viewYear, state.viewMonth + dir, 1);
        setView(newDate);
      } else if(action === 'jump-opening'){
        if(state.opening){ setView(state.opening); }
      } else if(action === 'jump-travel'){
        if(state.travelDate){ setView(state.travelDate); }
      } else if(action === 'jump-today'){
        setView(today);
      }
    });

    localCheck.addEventListener('change', function(){
      if(localCheck.checked){ puyumaCheck.checked = false; }
      if(state.travelDate || localCheck.checked){ renderResult(); }
    });
    puyumaCheck.addEventListener('change', function(){
      if(puyumaCheck.checked){ localCheck.checked = false; }
      if(state.travelDate){ renderResult(); }
    });

    renderGrid();
  }

  function ready(){
    var containers = document.querySelectorAll('.tccal-container');
    for(var i = 0; i < containers.length; i++){
      init(containers[i]);
    }
  }

  if(document.readyState === 'loading'){
    document.addEventListener('DOMContentLoaded', ready);
  } else {
    ready();
  }
})();
</script>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
		<item>
		<title>一句話卡片生成器</title>
		<link>https://0123456789.tw/quotes/</link>
		
		
		<pubDate>Wed, 05 Aug 2026 07:37:59 +0000</pubDate>
				<category><![CDATA[線上工具類]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[改圖]]></category>
		<category><![CDATA[製圖]]></category>
		<guid isPermaLink="false">https://0123456789.tw/?p=2187</guid>

					<description/>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img decoding="async" src="https://imgpoi.com/i/OWVJYB.png" alt=""/></figure>
]]></content:encoded>
					
		
		
			<dc:creator>t0918013013@gmail.com (admin)</dc:creator></item>
	</channel>
</rss>