以下是一个使用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>
.time-status { margin: 20px; padding: 15px; border-radius: 8px; }
.not-started { background-color: #f0f9ff; border-left: 4px solid #3498db; }
.in-progress { background-color: #fffbe6; border-left: 4px solid #f1c40f; }
.completed { background-color: #f8f9fa; border-left: 4px solid #95a5a6; }
</style>
</head>
<body>
<div class="time-status" data-date="2024-06-15" data-date-end="2024-06-20">
<!-- 状态将由JS填充 -->
</div>
<div class="time-status" data-date="2024-05-01" data-date-end="2024-05-10">
<!-- 状态将由JS填充 -->
</div>
<div class="time-status" data-date="2024-04-20" data-date-end="2024-04-25">
<!-- 状态将由JS填充 -->
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
// 获取所有时间状态元素
const statusElements = document.querySelectorAll('.time-status');
// 当前时间(使用Day.js)
const now = dayjs();
statusElements.forEach(element => {
// 从元素属性获取时间
const startDate = dayjs(element.dataset.date);
const endDate = dayjs(element.dataset.dateEnd);
// 确定状态
let status, statusClass;
if (now.isBefore(startDate)) {
status = '未开始';
statusClass = 'not-started';
} else if (now.isAfter(endDate)) {
status = '已结束';
statusClass = 'completed';
} else {
status = '进行中';
statusClass = 'in-progress';
}
// 添加状态文本和样式
element.textContent = `${status} (${startDate.format('YYYY-MM-DD')} 至 ${endDate.format('YYYY-MM-DD')})`;
element.classList.add(statusClass);
// 添加详细时间信息
const infoDiv = document.createElement('div');
infoDiv.style.marginTop = '8px';
infoDiv.style.fontSize = '0.85em';
infoDiv.style.color = '#7f8c8d';
if (now.isBefore(startDate)) {
infoDiv.textContent = `距离开始还有 ${startDate.diff(now, 'day')} 天`;
} else if (now.isAfter(endDate)) {
infoDiv.textContent = `已结束 ${now.diff(endDate, 'day')} 天`;
} else {
infoDiv.textContent = `已进行 ${now.diff(startDate, 'day')} 天,剩余 ${endDate.diff(now, 'day')} 天`;
}
element.appendChild(infoDiv);
});
});
</script>
</body>
</html>
```
### 实现说明:
1. **HTML结构**:
- 使用`data-date`存储开始时间
- 使用`data-date-end`存储结束时间
- 三种状态通过CSS类区分样式
2. **Day.js时间处理**:
```javascript
// 获取当前时间
const now = dayjs();
// 比较时间关系
if (now.isBefore(startDate)) { /* 未开始 */ }
else if (now.isAfter(endDate)) { /* 已结束 */ }
else { /* 进行中 */ }
```
3. **状态判断逻辑**:
- **未开始**:当前时间 < 开始时间
- **进行中**:开始时间 ≤ 当前时间 ≤ 结束时间
- **已结束**:当前时间 > 结束时间
4. **附加功能**:
- 显示距离开始/结束的天数
- 使用`dayjs.diff()`计算时间差
- 不同状态使用不同颜色标识
- 响应式设计适配不同设备
### 使用注意事项:
1. 时间格式需符合ISO标准(YYYY-MM-DD)
2. 确保Day.js库正确加载
3. 时区处理:默认使用本地时区,如需UTC可使用`dayjs.utc()`
4. 日期格式转换:使用`.format()`方法自定义显示格式
此实现会自动计算每个时间段的状态,并动态显示剩余/已过天数,视觉上通过不同颜色清晰区分三种状态。