formatTimestamp function

String formatTimestamp(
  1. int timestamp
)

格式化时间戳(兼容10位和13位)

  • 超过今年:返回 yyyy年MM月dd日
  • 今年内但不在本周:返回 MM月dd日
  • 本周但不是昨天:返回 周几
  • 昨天:返回 昨天
  • 今天:返回(上午/中午/下午/晚上/凌晨 HH:mm)

Implementation

String formatTimestamp(int timestamp) {
  timestamp = _normalizeTimestamp(timestamp);

  final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
  final DateTime now = DateTime.now();

  // 2. 今年的开始时间
  final DateTime startOfYear = DateTime(now.year, 1, 1);

  // 3. 本周的开始时间(周一)
  final DateTime startOfWeek = now.subtract(Duration(days: now.weekday - 1));
  final DateTime startOfWeekMidnight = DateTime(startOfWeek.year, startOfWeek.month, startOfWeek.day);

  // 4. 今天的开始时间
  final DateTime todayMidnight = DateTime(now.year, now.month, now.day);

  // 5. 昨天的开始时间
  final DateTime yesterdayMidnight = todayMidnight.subtract(const Duration(days: 1));

  // 判断是否超过今年
  if (dateTime.isBefore(startOfYear)) {
    return '${dateTime.year}年${dateTime.month}月${dateTime.day}日';
  }

  // 判断是否不在本周(且在今年内)
  if (dateTime.isBefore(startOfWeekMidnight)) {
    return '${dateTime.month}月${dateTime.day}日';
  }

  // 判断是否是昨天
  if (dateTime.isAfter(yesterdayMidnight) && dateTime.isBefore(todayMidnight)) {
    return '昨天';
  }

  // 判断是否是今天
  if (dateTime.isAfter(todayMidnight)) {
    final String timeStr = '${dateTime.hour}:${dateTime.minute}';
    final String period = _getPeriod(dateTime.hour);
    return '$period $timeStr';
  }

  // 本周但不是昨天,返回周几
  return _getWeekday(dateTime.weekday);
}