如何将DateTime转换为不同的时区?

Ser*_*gey 5 dart angular-dart

如何将DateTime转换为不同的时区?DateTime类具有两种方法.toLocal()和.toUtc()。但是,如果我想在其他时区显示时间。我该怎么做?

Bor*_*ris 13

这是我针对 EST 时区的解决方案,但您可以将其更改为任何其他时区

import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;


extension DateTimeExtension on DateTime {
  static int _estToUtcDifference;

  int _getESTtoUTCDifference() {
    if (_estToUtcDifference == null) {
      tz.initializeTimeZones();
      final locationNY = tz.getLocation('America/New_York');
      tz.TZDateTime nowNY = tz.TZDateTime.now(locationNY);
      _estToUtcDifference = nowNY.timeZoneOffset.inHours;
    }

    return _estToUtcDifference;
  }

  DateTime toESTzone() {
    DateTime result = this.toUtc(); // local time to UTC
    result = result.add(Duration(hours: _getESTtoUTCDifference())); // convert UTC to EST
    return result;
  }

  DateTime fromESTzone() {
    DateTime result = this.subtract(Duration(hours: _getESTtoUTCDifference())); // convert EST to UTC

    String dateTimeAsIso8601String = result.toIso8601String();
    dateTimeAsIso8601String += dateTimeAsIso8601String.characters.last.equalsIgnoreCase('Z') ? '' : 'Z';
    result = DateTime.parse(dateTimeAsIso8601String); // make isUtc to be true

    result = result.toLocal(); // convert UTC to local time
    return result;
  }
}
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 8

DateTime不包含时区信息,因此您无法DateTime在特定时区中创建只有系统时区和 UTC 可用的时区。

您可以将 DateTime 包装在自定义类中,并将时区信息添加到包装器中。您还需要每个时区的偏移量表,然后从 UTC 日期添加/减去偏移量。

  • 在 pub.dartlang.org 上弹出了一个新包,它似乎是这样做的:https://pub.dartlang.org/packages/timezone (3认同)
  • `DateTime` 具有 `timeZoneName` 和 `timeZoneOffset` 属性。 (2认同)
  • 但它只在本地和UTC之间转换 (2认同)

AKu*_*ior 7

我为此写了一个包。它称为 Instant,它可以转换全球任何给定时区的日期时间。详细查看https://aditya-kishore.gitbook.io/instant/

将 DateTime 转换为时区的基本用法非常简单:

//Assumes Instant is in your pubspec
import 'package:instant/instant.dart';

//Super Simple!
DateTime myDT = DateTime.now(); //Current DateTime
DateTime EastCoast = dateTimeToZone(zone: "EST", datetime: myDT); //DateTime in EST zone
return EastCoast;
Run Code Online (Sandbox Code Playgroud)

只需一行代码即可完成此操作,并且麻烦最少。


Mar*_*ius 5

您可以使用外部包,例如:timezone
请参阅此处的文档: https: //pub.dev/packages/timezone

以下是获取洛杉矶时间 (PST/PDT) 的示例代码。

import 'package:timezone/timezone.dart' as tz;
import 'package:timezone/data/latest.dart' as tz;

DateTime _getPSTTime() {
  tz.initializeTimeZones();

  final DateTime now = DateTime.now();
  final pacificTimeZone = tz.getLocation('America/Los_Angeles');

  return tz.TZDateTime.from(now, pacificTimeZone);
}
Run Code Online (Sandbox Code Playgroud)


jjc*_*chr -8

您可以使用 TimeZoneInfo.ConvertTime() 更改时区。尝试这样

DateTime hwTime = new DateTime(2007, 02, 01, 08, 00, 00);
try {
    TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
    TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local));
}
catch (TimeZoneNotFoundException) {
    Console.WriteLine("Timezone not found");
}                           
catch (InvalidTimeZoneException) {
    Console.WriteLine("Invalid Timezone");
}
Run Code Online (Sandbox Code Playgroud)

这将从夏威夷标准时间转换为当地时间。

这只是一个例子。使用它根据您的需要进行转换。