Flutter时区管理插件pg_timezone的使用

Flutter时区管理插件pg_timezone的使用

pg_timezone

这个包基于优化后的时间区域包,使其可以在postgresql驱动内部工作。由于这些修改,无需初始化。

该插件提供了IANA时间区域数据库和时区感知的DateTime类,即TZDateTime

当前时间区域数据库版本为2024a

你可以通过运行tool/refresh.sh来更新到最新的IANA时间区域数据库。

数据库变体

我们提供了三种不同的IANA数据库变体:

  • default:不包含废弃和历史时区(一些例外如"US/Eastern"和"Etc/UTC");这是所有数据库的约75%。
  • all:包含从IANA时间区域数据库中获取的所有数据。
  • 10y:默认数据库截取以包含过去5年和未来5年的历史数据;这种数据库大约是默认数据库大小的25%。

API

库命名空间

公共接口暴露了一些顶级函数。建议导入库时使用前缀(常用的前缀是tz),或者通过show子句导入特定成员。

Location

每个位置在数据库中代表自1970年以来所有时钟保持一致的国家或地区。位置由大陆或海洋及位置名称标识,通常是该地区的最大城市。例如,America/New_York代表美国东部大部分地区;America/Phoenix代表亚利桑那州大部分地区,该地区使用山地时间且没有夏令时(DST);America/Detroit代表密歇根州大部分地区,该地区使用东部时间但1975年有不同的夏令时规则;其他条目代表较小的地区,如印第安纳州Starke县,该地区在1991年从中部时间改为东部时间,并在2006年又改回中部时间。

IANA时间区域数据库

通过IANA数据库/Olson名称获取位置

final detroit = tz.getLocation('America/Detroit');

有关更多数据库条目的名称,可以查看Wikipedia列表

我们不提供任何根据时区缩写获取位置的函数,因为存在歧义。

时区缩写不应作为唯一标识符用于UTC偏移,因为它们在实践中具有歧义性。例如,“EST”在美国英语北美洲表示比UTC晚5小时,但在澳大利亚表示比UTC早10或11小时;法语北美用户更喜欢“HNE”而不是“EST”。

IANA时间区域数据库

TimeZone

TimeZone对象表示时区,并包含偏移量、夏令时标志和缩写形式的名称。

var timeInUtc = DateTime.utc(1995, 1, 1);
var timeZone = detroit.timeZone(timeInUtc.millisecondsSinceEpoch);

时区感知的DateTime

TZDateTime类实现了dart:core中的DateTime接口,并包含了有关位置和时区的信息。

var date = tz.TZDateTime(detroit, 2014, 11, 17);

在时区之间转换DateTime

要在这两个时区之间进行转换,只需使用from构造函数创建一个新的TZDateTime对象,并将LocationDateTime传递给构造函数。

var localTime = tz.DateTime(2010, 1, 1);
var detroitTime = tz.TZDateTime.from(localTime, detroit);

此构造函数支持任何实现DateTime接口的对象,因此您可以传递一个原生的DateTime对象或我们的TZDateTime

时间区域数据库

我们使用IANA时间区域数据库构建我们的数据库。

我们目前构建了三种不同的数据库变体:

  • default:不包含废弃和历史时区(一些例外如US/Eastern)。361kb
  • all:包含从IANA时间区域数据库中获取的所有数据。443kb
  • 10y:默认数据库,包含过去5年和未来5年的历史数据。85kb

更新时间区域数据库

更新时间区域数据库的脚本,它会自动下载IANA时间区域数据库并编译为我们自己的格式。

$ chmod +x tool/refresh.sh
$ tool/refresh.sh

注意,在Windows上,你可能需要遵循以下步骤:

在Windows 10上,安装/启动Ubuntu上的WindowsSubsystemforLinux (WSL)。然后在Ubuntu shell窗口中:

安装Dart并添加到PATH

sudo apt-get update
sudo apt-get install apt-transport-https
sudo sh -c 'curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
sudo sh -c 'curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
sudo apt-get update
sudo apt-get install dart
echo 'export PATH="$PATH:/usr/lib/dart/bin"' >> ~/.profile

关闭Ubuntu / WSL窗口,重新打开,以便使PATH更改生效。

克隆时间区域库并运行工具

git clone https://github.com/srawlins/timezone.git
cd timezone
pub run tool/get -s 2020a

替换2020a为最新版本

将文件复制到Windows文件系统

时间区域数据库生成并存储在时间区域文件夹下的lib/data中,因此请将它们从WSL文件系统复制到您的flutter项目中的Windows文件系统。我选择将它们放在项目的根目录下的assets文件夹中:

mv lib/data/2020a* /mnt/d/code/my-flutter-project/assets/timezone/

更多关于Flutter时区管理插件pg_timezone的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter时区管理插件pg_timezone的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter时区管理插件pg_timezone的使用,下面是一个基本的代码示例,展示了如何集成和使用该插件来管理时区。

首先,确保你的Flutter项目已经添加了pg_timezone依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  pg_timezone: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用pg_timezone插件。以下是一个简单的示例,展示了如何获取和设置时区:

import 'package:flutter/material.dart';
import 'package:pg_timezone/pg_timezone.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String currentTimezone = '';

  @override
  void initState() {
    super.initState();
    // 获取当前时区
    _getCurrentTimezone();
  }

  Future<void> _getCurrentTimezone() async {
    String timezone = await PGTimezone.getLocalTimezone();
    setState(() {
      currentTimezone = timezone;
    });
  }

  Future<void> _setTimezone(String newTimezone) async {
    // 注意:实际上Flutter应用通常无法直接“设置”设备的时区,
    // 这个函数只是为了演示如何使用插件获取时区字符串。
    // 在真实应用中,你可能需要将时区信息传递给后端服务或用于显示目的。
    setState(() {
      currentTimezone = newTimezone;
      // 这里可以添加代码来处理时区变更,比如更新UI或发送数据到服务器
    });
    // 打印新时区(仅用于演示)
    print('Timezone set to: $newTimezone');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Timezone Management'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('Current Timezone:'),
              SizedBox(height: 8.0),
              Text(currentTimezone, style: TextStyle(fontSize: 18)),
              SizedBox(height: 24.0),
              ElevatedButton(
                onPressed: () {
                  // 示例:将时区设置为"America/New_York"
                  _setTimezone('America/New_York');
                  // 注意:这不会实际更改设备的时区,只是演示
                },
                child: Text('Set Timezone to New York'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项:

  1. 时区设置:实际上,Flutter应用无法直接更改设备的时区设置。上面的_setTimezone函数仅用于演示如何传递和处理时区字符串。在真实应用中,你可能需要将时区信息传递给后端服务或用于特定的显示和处理逻辑。
  2. 时区获取PGTimezone.getLocalTimezone()函数用于获取设备的当前时区。这个时区信息可以用于显示、日志记录或传递给后端服务。
  3. 时区列表:如果你需要获取所有可用的时区列表,你可能需要依赖其他库或API,因为pg_timezone插件主要提供获取和格式化时区字符串的功能。

希望这个示例能帮助你理解如何在Flutter应用中使用pg_timezone插件进行时区管理。如果你有任何进一步的问题或需要更详细的解释,请随时提问。

回到顶部