Dart HttpDate
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpDate 类提供了用于解析和格式化 HTTP 标头中日期的实用程序。它支持 RFC 1123、RFC 850 和 ANSI C 日期格式。
HttpDate 对于处理 Last-Modified、Expires 和 Date 等 HTTP 标头至关重要。它是 Dart 的 dart:core 库的一部分。
基本定义
HttpDate 是一个用于 HTTP 日期处理的实用类。它包含根据 HTTP 标准解析和格式化日期的静态方法。
主要功能包括解析多种日期格式、严格的 RFC 合规性以及线程安全操作。Dart 的 HTTP 包内部使用了它。
解析 HTTP 日期
此示例演示了如何将 HTTP 日期字符串解析为 DateTime 对象。
import 'dart:core';
void main() {
var rfc1123 = 'Sun, 06 Nov 1994 08:49:37 GMT';
var rfc850 = 'Sunday, 06-Nov-94 08:49:37 GMT';
var asctime = 'Sun Nov 6 08:49:37 1994';
var date1 = HttpDate.parse(rfc1123);
var date2 = HttpDate.parse(rfc850);
var date3 = HttpDate.parse(asctime);
print(date1); // 1994-11-06 08:49:37.000Z
print(date2); // 1994-11-06 08:49:37.000Z
print(date3); // 1994-11-06 08:49:37.000Z
}
我们将三种不同的 HTTP 日期格式解析为 DateTime 对象。HttpDate 会自动处理所有标准格式,并返回 UTC DateTime 对象。
$ dart main.dart 1994-11-06 08:49:37.000Z 1994-11-06 08:49:37.000Z 1994-11-06 08:49:37.000Z
格式化 HTTP 日期
此示例演示了将 DateTime 对象格式化为 HTTP 日期字符串。
import 'dart:core';
void main() {
var date = DateTime.utc(1994, 11, 6, 8, 49, 37);
var httpDate = HttpDate.format(date);
print(httpDate); // Sun, 06 Nov 1994 08:49:37 GMT
var now = DateTime.now().toUtc();
print(HttpDate.format(now)); // Current time in RFC 1123 format
}
我们将 DateTime 对象格式化为符合 RFC 1123 标准的字符串。HttpDate.format 始终以 HTTP 标头使用的此标准格式生成日期。
$ dart main.dart Sun, 06 Nov 1994 08:49:37 GMT Mon, 04 Apr 2025 14:30:00 GMT
处理 HTTP 标头
此示例展示了 HttpDate 与 HTTP 标头的实际用法。
import 'dart:core';
void main() {
// Simulate HTTP response headers
var headers = {
'date': 'Mon, 04 Apr 2025 12:00:00 GMT',
'last-modified': 'Fri, 01 Jan 2021 00:00:00 GMT'
};
var date = HttpDate.parse(headers['date']!);
var lastModified = HttpDate.parse(headers['last-modified']!);
print('Response date: $date');
print('Last modified: $lastModified');
// Check if resource is fresh (less than 1 day old)
var isFresh = date.difference(lastModified) < Duration(days: 1);
print('Resource is fresh: $isFresh');
}
我们解析标准的 HTTP 日期标头并执行日期比较。这对于 HTTP 客户端中的缓存验证和条件请求来说很常见。
$ dart main.dart Response date: 2025-04-04 12:00:00.000Z Last modified: 2021-01-01 00:00:00.000Z Resource is fresh: false
错误处理
此示例演示了解析日期时的正确错误处理。
import 'dart:core';
void main() {
var invalidDate = 'Monday, 04-Apr-25 12:00:00 GMT';
try {
var date = HttpDate.parse(invalidDate);
print(date);
} on FormatException catch (e) {
print('Failed to parse date: ${e.message}');
print('Input: ${e.source}');
}
// Fallback to current time if parsing fails
var date = _parseHttpDateWithFallback(invalidDate);
print('Using date: $date');
}
DateTime _parseHttpDateWithFallback(String dateStr) {
try {
return HttpDate.parse(dateStr);
} on FormatException {
return DateTime.now().toUtc();
}
}
我们处理解析错误格式日期时的 FormatException。该示例展示了一种健壮的方法,在解析失败时回退到默认值。
$ dart main.dart Failed to parse date: Invalid HTTP date Input: Monday, 04-Apr-25 12:00:00 GMT Using date: 2025-04-04 14:30:00.123Z
自定义日期验证
此示例演示了如何验证和规范化 HTTP 日期。
import 'dart:core';
void main() {
var dates = [
'Sun, 06 Nov 1994 08:49:37 GMT',
'Sunday, 06-Nov-94 08:49:37 GMT',
'Sun Nov 6 08:49:37 1994',
'06 Nov 1994 08:49:37 GMT',
'Invalid Date'
];
for (var dateStr in dates) {
try {
var date = HttpDate.parse(dateStr);
var normalized = HttpDate.format(date);
print('Valid: $normalized');
} on FormatException {
print('Invalid: $dateStr');
}
}
}
我们验证多个日期字符串并将有效的日期规范化为 RFC 1123 格式。这演示了一个完整的 HTTP 日期验证和规范化流程。
$ dart main.dart Valid: Sun, 06 Nov 1994 08:49:37 GMT Valid: Sun, 06 Nov 1994 08:49:37 GMT Valid: Sun, 06 Nov 1994 08:49:37 GMT Invalid: 06 Nov 1994 08:49:37 GMT Invalid: Invalid Date
最佳实践
- 始终 UTC: HttpDate 仅支持 UTC 日期
- 错误处理: 解析时始终捕获 FormatException
- 规范化: 格式化为 RFC 1123 以保持一致性
- 性能: 尽可能重用已解析的 DateTime 对象
- 验证: 验证来自不受信任来源的日期
来源
本教程通过实际示例介绍了 Dart 的 HttpDate 类,展示了日期解析、格式化、错误处理和 HTTP 标头集成。
作者
列出 所有 Dart 教程。