Dart DateTime
最后修改日期:2025 年 6 月 4 日
本教程将使用 DateTime 类演示如何在 Dart 编程语言中管理日期和时间。
DateTime 对象表示一个特定的时刻,能够处理从公元前 271821 年 4 月 20 日到公元 275760 年 9 月 13 日的日期,涵盖了 Unix 纪元(UTC 1970 年 1 月 1 日)的 ±100,000,000 天。此类对于调度、时间戳计算和格式化日期等任务至关重要。
Dart 今天日期
本示例使用 DateTime 类检索当前的日期和时间。
void main() {
var now = DateTime.now();
print(now);
}
DateTime.now 方法返回本地时区的当前日期和时间,提供了一个当前时刻的快照。
$ dart main.dart 2025-06-04 10:59:00.123456
Dart DateTime 部分
DateTime 类提供了访问日期和时间各个组成部分的属性,例如年、月、日、时、分和秒。
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 在季节和地区之间保持一致,是标准化时间戳的理想选择。
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)以来的秒数(或更小的单位)。由于其简单性和一致性,它被广泛用于计算中以存储和计算时间戳。
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”。
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 包添加到项目中用于日期和时间格式化。
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 类通过 add 和 subtract 等方法支持算术运算,这些方法使用 Duration 对象调整时间戳。
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 对象。
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 方法来确定时间戳的相对顺序。
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 类根据用户的出生日期计算其年龄。在此示例中,我们为用户定义了一个记录类型,将出生日期存储为字符串,并通过解析日期并将其与当前日期进行比较来计算每个用户的年龄。
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 等第三方包指定自定义时区。
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 类探讨了在 Dart 中处理日期和时间,涵盖了创建、操作、格式化和比较。
作者
列出 所有 Dart 教程。