flutter如何获取设备时区

在Flutter开发中,如何获取当前设备所在的时区信息?需要的是时区名称(如"Asia/Shanghai")而非简单的UTC偏移量。官方文档提到DateTime类,但获取到的时区信息不够具体,是否有更可靠的第三方库或系统API可以实现?最好能兼容iOS和Android平台。

2 回复

在Flutter中,使用DateTime.now().timeZoneOffset获取设备时区偏移量,或通过flutter_native_timezone包获取时区名称。

更多关于flutter如何获取设备时区的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,可以通过以下方法获取设备时区:

1. 使用 dart:core 库的 DateTime 类

DateTime now = DateTime.now();
String timeZoneName = now.timeZoneName;    // 获取时区名称(如:CST、EST)
int timeZoneOffset = now.timeZoneOffset;   // 获取与 UTC 的时差(小时)

2. 使用 flutter_native_timezone 包(推荐用于获取精确时区)

  • 添加依赖到 pubspec.yaml
dependencies:
  flutter_native_timezone: ^2.0.0
  • 代码实现:
import 'package:flutter_native_timezone/flutter_native_timezone.dart';

String currentTimeZone = await FlutterNativeTimezone.getLocalTimezone();
// 返回格式:Asia/Shanghai、America/New_York

3. 完整示例

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

class TimeZoneExample extends StatefulWidget {
  @override
  _TimeZoneExampleState createState() => _TimeZoneExampleState();
}

class _TimeZoneExampleState extends State<TimeZoneExample> {
  String _timeZone = '';

  @override
  void initState() {
    super.initState();
    _getTimeZone();
  }

  _getTimeZone() async {
    // 方法1:使用 flutter_native_timezone
    final String nativeTimezone = await FlutterNativeTimezone.getLocalTimezone();
    
    // 方法2:使用 DateTime
    final DateTime now = DateTime.now();
    
    setState(() {
      _timeZone = '原生时区: $nativeTimezone\n'
                 '时区名称: ${now.timeZoneName}\n'
                 'UTC偏移: ${now.timeZoneOffset}';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(_timeZone),
      ),
    );
  }
}

注意事项:

  • DateTime.timeZoneName 返回的是缩写(可能不唯一)
  • flutter_native_timezone 返回的是 IANA 时区标识(更精确)
  • 时区偏移量 timeZoneOffset 包含夏令时调整

选择方案根据需求决定:如只需显示时差可用 DateTime,需要精确时区识别建议使用 flutter_native_timezone。

回到顶部