ZetCode

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 对象。

main.dart
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 日期字符串。

main.dart
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 标头的实际用法。

main.dart
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

错误处理

此示例演示了解析日期时的正确错误处理。

main.dart
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 日期。

main.dart
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

最佳实践

来源

Dart HttpDate 文档

本教程通过实际示例介绍了 Dart 的 HttpDate 类,展示了日期解析、格式化、错误处理和 HTTP 标头集成。

作者

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

列出 所有 Dart 教程