ZetCode

Dart DateTime

最后修改日期:2025 年 6 月 4 日

本教程将使用 DateTime 类演示如何在 Dart 编程语言中管理日期和时间。

DateTime 对象表示一个特定的时刻,能够处理从公元前 271821 年 4 月 20 日到公元 275760 年 9 月 13 日的日期,涵盖了 Unix 纪元(UTC 1970 年 1 月 1 日)的 ±100,000,000 天。此类对于调度、时间戳计算和格式化日期等任务至关重要。

Dart 今天日期

本示例使用 DateTime 类检索当前的日期和时间。

main.dart
void main() {

  var now = DateTime.now();
  print(now);
}

DateTime.now 方法返回本地时区的当前日期和时间,提供了一个当前时刻的快照。

$ dart main.dart
2025-06-04 10:59:00.123456

Dart DateTime 部分

DateTime 类提供了访问日期和时间各个组成部分的属性,例如年、月、日、时、分和秒。

main.dart
void main() {

  var now = DateTime.now();

  print("Year is ${now.year}");
  print("Month is ${now.month}");
  print("Day is ${now.day}");
  print("Hour is ${now.hour}");
  print("Minutes is ${now.minute}");
  print("Second is ${now.second}");
}

此程序提取并打印当前日期和时间的年、月、日、时、分和秒,演示了如何访问 DateTime 对象的特定组件。

$ dart main.dart
Year is 2025
Month is 6
Day is 4
Hour is 10
Minutes is 59
Second is 0

Dart UTC 时间

协调世界时 (UTC) 是全球统一的时间标准,用于航空、天气预报和计算等领域。与本地时间不同,UTC 在季节和地区之间保持一致,是标准化时间戳的理想选择。

main.dart
void main() {

  var now = DateTime.now();
  print(now);
  print(now.isUtc);

  print('---------------------');

  var utc = now.toUtc();
  print(utc);
}

toUtc 方法将 DateTime 对象转换为 UTC,而 isUtc 检查对象是否为 UTC。此示例显示本地时间,确认其不是 UTC,然后显示 UTC 等效时间。

$ dart main.dart
2025-06-04 10:59:00.123456
false
---------------------
2025-06-04 08:59:00.123456Z

Dart Unix 时间

Unix 时间表示自 Unix 纪元(UTC 1970 年 1 月 1 日 00:00:00)以来的秒数(或更小的单位)。由于其简单性和一致性,它被广泛用于计算中以存储和计算时间戳。

main.dart
void main() {

  var now = DateTime.now();
  print(now.microsecondsSinceEpoch);
}

microsecondsSinceEpoch 属性返回自 Unix 纪元以来的微秒数,提供了一种将时间表示为单个数字值的精确方法。

$ dart main.dart
1749027998477607

Dart DateTime 解析

parse 方法从字符串创建 DateTime 对象,支持 ISO 8601 格式的子集,例如“YYYY-MM-DD”或“YYYYMMDDThhmmss”。

main.dart
void main() {

  var pattern = "2021-10-07";

  DateTime dt = DateTime.parse(pattern);
  print(dt);
}

本示例将“YYYY-MM-DD”格式的字符串解析为 DateTime 对象,演示了如何将文本日期表示转换为可用的对象。

Dart 格式化 DateTime

intl 包提供了用于将 DateTime 对象格式化为人类可读字符串的工具,支持各种模式和区域设置以实现自定义输出。

$ dart pub add intl

此命令将 intl 包添加到项目中用于日期和时间格式化。

main.dart
import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';

void main() {

  var now = DateTime.now();
  print(now);

  String pattern = 'yyyy-MM-dd';
  String formatted = DateFormat(pattern).format(now);
  print(formatted);

  print(DateFormat.yMMMMd('en_US').format(now));

  initializeDateFormatting('sk_SK', null)
      .then((_) => print(DateFormat.yMMMMd('sk_SK').format(now)));
}

此程序使用 intl 包格式化当前的日期和时间。它为英语(美国)和斯洛伐克语(SK)应用自定义模式(“yyyy-MM-dd”)和特定于区域设置的格式。

String pattern = 'yyyy-MM-dd';
String formatted = DateFormat(pattern).format(now);
print(formatted);

DateFormat 类根据指定的模式将 DateTime 对象格式化为字符串,例如“yyyy-MM-dd”表示年-月-日。

initializeDateFormatting('sk_SK', null)
    .then((_) => print(DateFormat.yMMMMd('sk_SK').format(now)));

initializeDateFormatting 方法支持特定于区域设置的格式,允许使用符合文化习惯的日期表示,例如斯洛伐克语的“27. júna 2025”。

$ dart main.dart
2025-06-04 10:59:00.123456
2025-06-04
June 4, 2025
4. júna 2025

Dart 添加和减去 DateTime

DateTime 类通过 addsubtract 等方法支持算术运算,这些方法使用 Duration 对象调整时间戳。

main.dart
void main() {
  
  DateTime dt = DateTime(2019, 2, 22, 14, 0, 0);

  var dt1 = dt.add(Duration(days: 5));
  var dt2 = dt.add(Duration(days: 5, hours: 23, seconds: 54));
  var dt3 = dt.subtract(Duration(days: 56));

  print(dt1);
  print(dt2);
  print(dt3);
}

此程序演示了向 DateTime 对象添加和减去持续时间,为未来的和过去的日期创建新的时间戳。

$ dart main.dart
2019-02-27 14:00:00.000
2019-02-28 13:00:54.000
2018-12-28 14:00:00.000

博罗季诺战役

difference 方法计算两个 DateTime 对象之间的时间间隔,返回一个 Duration 对象。

main.dart
void main() {
  
  var now = DateTime.now();
  var borodino_battle = DateTime(1812, 9, 7);

  var diff = now.difference(borodino_battle).inDays;

  print("$diff days have passed since the Battle of Borodino");
}

本示例通过计算当前日期与历史事件之间的差值,来计算自博罗季诺战役(1812 年 9 月 7 日)以来的天数。

$ dart borodino.dart
77702 days have passed since the Battle of Borodino

Dart DateTime 比较

DateTime 类使用标准的比较运算符,如 <>==<=>=,以及 compareTo 方法来确定时间戳的相对顺序。

datetime_comparison.dart
void main() {
  
  var date1 = DateTime(2025, 6, 4);
  var date2 = DateTime(2025, 6, 5);
  var date3 = DateTime(2025, 6, 4);

  print('date1 == date2: ${date1 == date2}');
  print('date1 < date2: ${date1 < date2}');
  print('date1 > date2: ${date1 > date2}');
  print('date1 <= date3: ${date1 <= date3}');
  print('date2 >= date1: ${date2 >= date1}');
  print('date1.compareTo(date2): ${date1.compareTo(date2)}');
  print('date1.compareTo(date3): ${date1.compareTo(date3)}');
}

此示例使用标准运算符和 compareTo 方法比较 DateTime 对象,该方法分别返回 -1、0 或 1 表示小于、等于或大于。

计算用户列表的年龄

您可以使用 DateTime 类根据用户的出生日期计算其年龄。在此示例中,我们为用户定义了一个记录类型,将出生日期存储为字符串,并通过解析日期并将其与当前日期进行比较来计算每个用户的年龄。

user_age.dart
void main() {
  
  var users = [
    (name: 'Alice', dateOfBirth: '1990-05-12'),
    (name: 'Bob', dateOfBirth: '1985-11-23'),
    (name: 'Charlie', dateOfBirth: '2000-01-01'),
  ];

  var now = DateTime.now();

  for (var user in users) {
    var dob = DateTime.parse(user.dateOfBirth);
    var age = now.year - dob.year;
    if (now.month < dob.month || (now.month == dob.month && now.day < dob.day)) {
      age--;
    }
    print('${user.name} is $age years old.');
  }
}

此示例将用户定义为记录列表,每个记录都包含姓名和出生日期字符串。该程序解析每个出生日期,通过将其与当前日期进行比较来计算年龄,并打印每个用户的结果。

Dart DateTime 时区

DateTime 类支持时区操作,允许在本地时间和 UTC 时间之间进行转换,或使用 timezone 等第三方包指定自定义时区。

datetime_timezone.dart
void main() {

  var now = DateTime.now();
  var utcNow = DateTime.now().toUtc();

  print('Local time: $now');
  print('UTC time: $utcNow');
  print('Is UTC: ${utcNow.isUtc}');

  // Create DateTime in a specific time zone (UTC)
  var utcDate = DateTime.utc(2025, 6, 4, 10, 59);
  print('Custom UTC date: $utcDate');
}

此示例演示了使用 DateTime.utc 创建 UTC DateTime 以及使用 toUtc 将本地时间转换为 UTC,重点介绍了 Dart 中的时区处理。

$ dart datetime_timezone.dart
Local time: 2025-06-04 10:59:00.123456
UTC time: 2025-06-04 08:59:00.123456Z
Is UTC: true
Custom UTC date: 2025-06-04 10:59:00.000Z

来源

DateTime - 语言参考

本教程通过 DateTime 类探讨了在 Dart 中处理日期和时间,涵盖了创建、操作、格式化和比较。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程