以下是使用Day.js实现时间状态显示的完整解决方案:
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>活动状态显示</title>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<style>
.hidden { display: none; }
.status-btn { margin: 20px 0; }
.item-moer { padding: 5px 10px; margin: 5px; border-radius: 4px; }
.state-upcoming { background-color: #ffecd9; color: #ff8c00; }
.state-ongoing { background-color: #e6f7ff; color: #1890ff; }
.state-past { background-color: #f6ffed; color: #52c41a; }
</style>
</head>
<body>
<!-- 示例HTML结构 -->
<div class="status-btn" data-date="2025-05-24" data-date-end="2025-05-25">
<div class="item-moer item-state-start state-upcoming hidden">
<span>未开始</span>
</div>
<div class="item-moer item-state-start state-ongoing hidden">
<a href="/zh-hans/node/1497">进行中</a>
</div>
<div class="item-moer item-state-end state-past hidden">
<span>已结束</span>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// 获取所有状态容器
const statusContainers = document.querySelectorAll('.status-btn');
statusContainers.forEach(container => {
// 获取时间数据
const startDate = dayjs(container.dataset.date);
const endDate = dayjs(container.dataset.dateEnd);
const now = dayjs();
// 获取三个状态元素
const upcomingEl = container.querySelector('.state-upcoming');
const ongoingEl = container.querySelector('.state-ongoing');
const pastEl = container.querySelector('.state-past');
// 隐藏所有状态
upcomingEl.classList.add('hidden');
ongoingEl.classList.add('hidden');
pastEl.classList.add('hidden');
// 根据时间判断显示状态
if (now.isBefore(startDate)) {
upcomingEl.classList.remove('hidden');
}
else if (now.isAfter(endDate)) {
pastEl.classList.remove('hidden');
}
else {
ongoingEl.classList.remove('hidden');
}
});
});
</script>
</body>
</html>
```
### 实现原理说明:
1. **时间比较逻辑**:
- 使用`dayjs().isBefore()`判断当前时间是否在开始时间之前 → **未开始**
- 使用`dayjs().isAfter()`判断当前时间是否在结束时间之后 → **已结束**
- 中间状态自动视为 → **进行中**
2. **DOM操作流程**:
- 初始化时隐藏所有状态元素
- 根据时间条件移除对应元素的`hidden`类
- 使用`dataset`获取HTML5自定义属性值
3. **时间处理要点**:
- Day.js自动解析ISO格式日期(YYYY-MM-DD)
- 精确到日的比较(忽略具体时间)
- 自动处理时区差异(使用本地时区)
### 使用注意事项:
1. 确保引入Day.js库(已包含在代码中)
2. 日期格式必须为`YYYY-MM-DD`格式
3. 多个状态容器可同时处理
4. 状态样式可通过CSS自定义调整
此方案会自动根据服务器时间(用户本地时间)实时显示活动状态,无需刷新页面即可动态更新(页面加载时计算)。