跳转到内容

模板:生物联赛倒计时:修订间差异

来自osm&bio
Magezeya留言 | 贡献
无编辑摘要
Magezeya留言 | 贡献
无编辑摘要
 
(未显示同一用户的5个中间版本)
第1行: 第1行:
<noinclude>这是用于显示距离下一届全国生物学奥林匹克竞赛联赛天数的模板。使用{{Countdown}}模板计算天数。</noinclude>
<includeonly>
<includeonly>
<!-- 定义未来25年(2025-2050)全国生物联赛日期(五月第二个星期日) -->
<div class="biology-countdown">
{{#arraydefine:bio_dates
  <div class="countdown-header">
  | 2025-05-11, 2026-05-10, 2027-05-09, 2028-05-14, 2029-05-13, 2030-05-12
    <div class="dna-icon">🧬</div>
  | 2031-05-11, 2032-05-09, 2033-05-08, 2034-05-14, 2035-05-13, 2036-05-11
    <h3>全国中学生生物学联赛倒计时</h3>
  | 2037-05-10, 2038-05-09, 2039-05-08, 2040-05-13, 2041-05-12, 2042-05-11
  </div>
  | 2043-05-10, 2044-05-08, 2045-05-14, 2046-05-13, 2047-05-12, 2048-05-10
 
   | 2049-05-09, 2050-05-08
  <div class="countdown-content">
}}
    <div class="countdown-text">
      距离{{#if: {{{text|}}} | {{{text}}} | 全国奥林匹克生物学联赛}}还有
    </div>
   
    <div class="countdown-timer">
      <!-- 确定下一个联赛日期并计算倒计时 -->
      {{#ifexpr: {{#time:U}} < {{#time:U|2025-05-11}} |
        <!-- 使用2025年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2025-05-11}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2025-05-11}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2025-05-11}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2025-05-11}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2026-05-10}} |
        <!-- 使用2026年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2026-05-10}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2026-05-10}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2026-05-10}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2026-05-10}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2027-05-09}} |
        <!-- 使用2027年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2027-05-09}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2027-05-09}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2027-05-09}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2027-05-09}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2028-05-14}} |
        <!-- 使用2028年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2028-05-14}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2028-05-14}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2028-05-14}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2028-05-14}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2029-05-13}} |
        <!-- 使用2029年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2029-05-13}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2029-05-13}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2029-05-13}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2029-05-13}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2030-05-12}} |
        <!-- 使用2030年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2030-05-12}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2030-05-12}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2030-05-12}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2030-05-12}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2031-05-11}} |
        <!-- 使用2031年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2031-05-11}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2031-05-11}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2031-05-11}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2031-05-11}} - {{#time:U}}}}</span><span class="countdown-unit">极</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2032-05-09}} |
        <!-- 使用2032年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2032-05-09}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2032-05-09}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2032-05-09}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2032-05-09}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2033-05-08}} |
        <!-- 使用2033年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2033-05-08}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2033-05-08}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2033-05-08}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2033-05-08}} - {{#time:U}}}}</span><span极 class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2034-05-14}} |
        <!-- 使用2034年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2034-05-14}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2034-05-14}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2034-05-14}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2034-05-14}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      | {{#ifexpr: {{#time:U}} < {{#time:U|2035-05-13}} |
        <!-- 使用2035年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2035-05-13}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2035-05-13}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2035-05-13}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:极U|2035-05-13}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      |
        <!-- 如果所有日期都已过去,显示2035年日期 -->
        {{#switch: {{#if: {{{time|}}} | {{{time}}} | day}}
          | day = <span class="countdown-number">{{#expr: floor(({{#time:U|2035-05-13}} - {{#time:U}})/86400)}}</span><span class="countdown-unit">天</span>
          | hour = <span class="countdown-number">{{#expr: floor(({{#time:U|2035-05-13}} - {{#time:U}})/3600)}}</span><span class="countdown-unit">小时</span>
          | minute = <span class="countdown-number">{{#expr: floor(({{#time:U|2035-05-13}} - {{#time:U}})/60)}}</span><span class="countdown-unit">分钟</span>
          | second = <span class="countdown-number">{{#expr: {{#time:U|2035-05-13}} - {{#time:U}}}}</span><span class="countdown-unit">秒</span>
        }}
      }}}}}}}}}}}}
    </div>
   
    <div class="countdown-date">
      下一届联赛日期:
      {{#ifexpr: {{#time:U}} < {{#time:U|2025-05-11}} | 2025-05-11 |
        {{#ifexpr: {{#time:U}} < {{#time:U|2026-05-10}} | 2026-05-10 |
          {{#ifexpr: {{#time:U}} < {{#time:U|2027-05-09}} | 2027-05-09 |
            {{#ifexpr: {{#time:U}} < {{#time:U|2028-05-14}} | 2028-05-14 |
              {{#ifexpr: {{#time:U}} < {{#time:U|2029-05-13}} | 2029-05-13 |
                {{#ifexpr: {{#time:U}} < {{#time:U|2030-05-12}} | 2030-05-12 |
                  {{#ifexpr: {{#time:U}} < {{#time:U|2031-05-11}} | 2031-05-11 |
                    {{#ifexpr: {{#time:U}} < {{#time:U|2032-05-09}} | 2032-05-09 |
                      {{#ifexpr: {{#time:U}} < {{#time:U|2033-05-08}} | 2033-05-08 |
                        {{#ifexpr: {{#time:U}} < {{#time:U|2034-05-14}} | 2034-05-14 |
                          {{#ifexpr: {{#time:U}} < {{#time:U|2035-05-13}} | 2035-05-13 | 2035-05-13
                          }}
                        }}
                      }}
                    }}
                  }}
                }}
              }}
            }}
          }}
        }}
      }}
    </div>
  </div>
 
  <div class="countdown-footer">
    <small>全国中学生生物学竞赛委员会</small>
  </div>
</div>
 
<style>
.biology-countdown {
  background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%);
  border-radius: 12px;
  padding: 20px;
   box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
  border: 1px solid #81c784;
  font-family: 'Helvetica Neue', Arial, sans-serif;
  max-width: 400px;
  margin: 10px auto;
  text-align: center;
  position: relative;
  overflow: hidden;
}
 
.biology-countdown::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 4px;
  background: linear-gradient(90极deg, #4caf50, #8bc34a, #cddc39);
}


<!-- 获取当前年份 (YYYY) -->
.countdown-header {
{{#vardefine:current_year|{{#time:Y}}}}
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 15px;
}


<!-- 初始化目标日期变量 -->
.dna-icon {
{{#vardefine:target_date|}}
  font-size: 28px;
  margin-right: 10px;
}


<!-- 循环查找下一个联赛日期 -->
.countdown-header h3 {
{{#forargs:
   margin: 0;
   | arg | val | @@@@ | <!-- 占位符,实际不需要参数名 -->
   color: #2e7d32;
   | {{#arrayindex:date_candidate|bio_dates|{{#var:loopindex}}}}
  font-size: 18px;
   {{#if: {{#var:target_date}} | | <!-- 如果还没找到target_date,则继续检查 -->
   font-weight: 600;
      {{#ifexpr:
}
        ( {{#time:U|{{#var:date_candidate}}}} >= {{#time:U}} ) OR <!-- 候选日期是未来或今天 -->
 
        ( {{#time:U|{{#var:date_candidate}}|Y}} > {{#var:current_year}} ) <!-- 或者候选日期的年份已超过当前年(说明当前年联赛已过) -->
.countdown-content {
        | {{#vardefine:target_date|{{#var:date_candidate}}}} <!-- 找到!赋值给target_date -->
   margin: 15px 0;
      }}
}
   }}
}}


<!-- 确保如果循环结束还没找到(理论上应该不会,但保险起见),使用数组最后一个日期 -->
.countdown-text {
{{#if: {{#var:target_date}} | | {{#vardefine:target_date|{{#arrayindex:last_date|bio_dates|-1}}}} }}
  color: #388e3c;
  font-size: 16px;
  margin-bottom: 10px;
}


<!-- 获取目标日期的年份用于显示 -->
.countdown-timer {
{{#vardefine:target_year|{{#time:Y|{{#var:target_date}}}}}}
  display: flex;
  justify-content: center;
  align-items: baseline;
  margin: 15px 0;
}


<!-- 华丽倒计时显示框 -->
.countdown-number {
<div style="
   font-size: 36px;
  position:relative;
   font-weight: bold;
  width:320px; max-width:90%;
   color: #d32f2f;
  margin:2em auto;
   margin: 0 5px;
  padding:2.5em 1.5em 2em;
   animation: pulse 2s infinite;
  border-radius:18px;
}
   background: linear-gradient(135deg, #0b1928 0%, #1a3a4a 50%, #2c5d73 100%);
  color:#fff;
   font-family:'Segoe UI', Arial, Helvetica, sans-serif;
  text-align:center;
   box-shadow:
    0 0 15px #00f5ff,
    0 0 30px #00f5ff44,
    inset 0 0 8px #00000088,
    inset 0 0 15px rgba(0, 245, 255, 0.2);
   overflow:hidden;
  z-index:0;
">
  <!-- 扫描光 (更柔和) -->
   <div style="
    position:absolute; top:-50%; left:-50%;
    width:200%; height:200%;
    background: linear-gradient(90deg, transparent 0%, rgba(0, 245, 255, 0.05) 50%, transparent 100%);
    animation: scan 8s linear infinite;
    pointer-events:none; z-index:-1;
  "></div>


  <!-- 动态粒子背景 (可选,增加科技感) -->
.countdown-unit {
   <div style="
   font-size: 18px;
    position:absolute; top:0; left:0; width:100%; height:100%;
  color: #555;
    background-image: radial-gradient(rgba(0, 245, 255, 0.1) 1px, transparent 1px);
  margin-left: 5px;
    background-size: 20px 20px;
}
    pointer-events:none; z-index:-1;
  "></div>


  <style>
.countdown-date {
    @keyframes scan {
  color: #689f38;
      0% { transform: translateX(-100%); }
  font-size: 14px;
      100% { transform: translateX(100%); }
  margin-top: 10px;
    }
  font-style: italic;
    @keyframes pulse {
}
      0%, 100% { transform: scale(1); text-shadow: 0 0 5px #fff, 0 0 10px #00f5ff; }
      50% { transform: scale(1.05); text-shadow: 0 0 15px #fff, 0 0 20px #00f5ff, 0 0 30px #00f5ff; }
    }
    .countdown-number {
      animation: pulse 3s ease-in-out infinite;
    }
  </style>


  <!-- 标题 -->
.countdown-footer {
   <div style="
   border-top: 1px solid #a5d6a7;
    font-size:24px; font-weight:700; letter-spacing:1.5px; margin-bottom:1em;
  padding-top: 10px;
    color: #a8fff6; /* 更亮的青蓝色 */
  margin-top: 15px;
    text-shadow: 0 0 5px rgba(0, 245, 255, 0.7);
}
  ">
    全国生物联赛倒计时
  </div>


  <!-- 年份显示 -->
.countdown-footer small {
   <div style="
   color: #78909c;
    font-size:18px; font-weight:600; margin-bottom:0.5em;
  font-size: 12px;
    color: #c7fcff;
}
  ">
    距离 {{#var:target_year}} 年全国生物联赛还有
  </div>


  <!-- 倒计时数字 (核心) -->
@keyframes pulse {
   <div style="
   0% { transform: scale(1); }
    font-size:48px; font-weight:900;
  50% { transform: scale(1.05); }
    color: #ffffff;
  100% { transform: scale(1); }
    padding: 0.3em 0.8em;
}
    border-radius: 14px;
    background: rgba(10, 25, 40, 0.6);
    display: inline-block;
    box-shadow:
      inset 0 0 10px rgba(0, 0, 0, 0.7),
      0 0 15px rgba(0, 245, 255, 0.5);
    border: 2px solid rgba(0, 245, 255, 0.4);
    margin: 0.5em 0;
    position: relative;
    z-index: 1;
  ">
    <span class="countdown-number">
      {{Countdown|{{#var:target_date}}|text=天}} <!-- 调用核心倒计时模板 -->
    </span>
  </div>


  <!-- 底部装饰/备注 -->
@media (max-width: 480px) {
   <div style="
   .biology-countdown {
     font-size:12px; margin-top:1.5em; opacity:0.8;
     padding: 15px;
     color: #a0e4f0;
    margin: 10px;
   ">
  }
     日期依据:每年五月第二个星期日
 
   </div>
  .countdown-number {
</div>
     font-size: 28px;
   }
 
  .countdown-header h3 {
     font-size: 16px;
   }
}
</style>
</includeonly>
</includeonly>
<noinclude>
{{documentation}}
</noinclude>

2025年8月22日 (五) 12:22的最新版本


模板文档  [[{{fullurl:local p = {}

-- 预定义的联赛日期表(2025-2035年五月的第二个星期日) local olympiadDates = {

   "2025-05-11",
   "2026-05-10",
   "2027-05-09",
   "2028-05-14",
   "2029-05-13",
   "2030-05-12",
   "2031-05-11",
   "2032-05-09",
   "2033-05-08",
   "2034-05-14",
   "2035-05-13"

}

function p.getNextDate()

   local currentTime = os.time()
   
   for i, dateStr in ipairs(olympiadDates) do
       local datePattern = "(%d+)-(%d+)-(%d+)"
       local year, month, day = dateStr:match(datePattern)
       local olympiadTime = os.time({year = year, month = month, day = day})
       
       if olympiadTime > currentTime then
           return dateStr
       end
   end
   
   -- 如果所有日期都已过去,返回最后一个日期
   return olympiadDates[#olympiadDates]

end

return p|action=edit}} 创建]] [刷新]