Flutter时间或日期相关插件now的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter时间或日期相关插件now的使用

now 是一个极简主义的 DateTime 库,用于验证、解析、操作和格式化时间。

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  now: latest

或者从命令行安装:

dart pub add now

使用示例

以下是一个完整的示例代码,展示了如何使用 now 插件来创建、格式化、转换、添加和减去日期时间,并进行比较。

创建一个 DateTime

/// 创建一个新的本地时区 DateTime。
final current = now(); // 同 DateTime.now()
final utc = now.utc(); // 同 DateTime.now().toUtc()

格式化一个 DateTime

final pattern = 'YYYY-MM-DD HH:mm:ss.SSS';
final formated = now().format(pattern); // 同 DateTime.now().format(pattern)

print(formated); // 输出类似于 "2021-08-01 12:00:00.000"

转换一个 DateTime

/// 获取一个安全的 UTC 时间,原始时间来自不同的时区。
final date = now();
final utc = date.isUtc ? date : date.toUtc();

/// 使用 now.utc 方法简化转换。
final utc = date.utc; // 同 date.isUtc ? date : date.toUtc();

日期时间的加法和减法

final date = now();

/// 增加 1 天。
final tomorrow = date + 1.day; // 同 date.add(Duration(days: 1));

/// 减少 1 天。
final yesterday = date - 1.day; // 同 date.subtract(Duration(days: 1));

日期时间的比较

final date1 = now();
final date2 = date1 + 1.day;

/// 比较 DateTime 是否小于等于另一个 DateTime。
print(date1 <= date2); // 输出 true
print(date1.isBeforeOrEqual(date2)); // 输出 true

/// 比较 DateTime 是否大于等于另一个 DateTime。
print(date2 >= date1); // 输出 true
print(date2.isAfterOrEqual(date1)); // 输出 true

/// 比较 DateTime 是否小于另一个 DateTime。
print(date1 < date2); // 输出 true
print(date1.isBefore(date2)); // 输出 true

/// 比较 DateTime 是否大于另一个 DateTime。
print(date2 > date1); // 输出 true
print(date2.isAfter(date1)); // 输出 true

Duration 扩展

周数在持续时间内
final Duration duration = Duration(days: 7);

print(duration.inWeeks); // 输出 1
将整数转换为 Duration
final microseconds = 1.microsecond;
final milliseconds = 1.millisecond;
final seconds = 1.second;
final minutes = 1.minute;
final hours = 1.hour;
final days = 1.day;
final weeks = 1.week;

日期时间格式化

默认情况下,我们注册了所有内置的格式化器。

final DateTimeFormatter formatter = ...

now.register(formatter);

你可能已经有了一个日期时间格式化器,但其格式化符不是你期望的:

final DateTimeFormatter formatter = ...

now.registerWith('Custom specifier', formatter);

自定义格式化器

如果你希望自定义日期时间格式化器,你需要实现 DateTimeFormatter 接口:

import 'package:now/formatter.dart';

class MyFormatter implements DateTimeFormatter {
  const MyFormatter();

  /// 匹配 [specifier] 并返回 [DateTime] 的格式化结果。
  @override
  String format(DateTime dateTime) {
    // TODO: 格式化 [dateTime] 并返回结果。
    return 'My format result';
  }

  @override
  String get specifier => 'My specifier';
}

main() {
  now.register(const MyFormatter());

  print(now().format('YYYY - My specifier')); // 输出 "2023 - My format result"
}

基于函数的格式化器

如果你不想实现 DateTimeFormatter 接口,也可以使用基于函数的格式化器:

import 'package:now/now.dart';

main() {
  now.registerWithFn('My specifier', (dateTime) {
    return 'My format result';
  });

  print(now().format('YYYY - My specifier')); // 输出 "2023 - My format result"
}

秒表

我们提供了一个帮助方法,可以直接创建并启动秒表:

final stopwatch = now.stopwatch(); // 同 Stopwatch()..start()

销毁格式化器

now.destroy((f) => f.specifier == 'A');
now.destroyAll();
now.destroyWith('A');
now.destroyDefault();

更多关于Flutter时间或日期相关插件now的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter时间或日期相关插件now的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,处理时间和日期相关的功能通常会用到一些非常流行的插件,比如intlflutter_localizations。尽管没有直接名为now的插件,但我们可以使用Flutter内置的DateTime类以及一些第三方库来展示当前时间或日期。以下是一些关于如何使用这些功能的代码示例。

使用 DateTime 类获取当前时间或日期

Flutter的Dart语言内置了DateTime类,可以方便地获取当前时间或日期。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Current Date and Time'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Current Date: ${DateTime.now().toLocal().toDateString()}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Current Time: ${DateTime.now().toLocal().toTimeOfDay()}',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

使用 intl 插件格式化日期和时间

intl插件提供了强大的国际化支持,包括日期和时间的格式化。

首先,在pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  intl: ^0.17.0 # 请检查最新版本号

然后,在代码中导入并使用intl

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final DateFormat formatter = DateFormat('yyyy-MM-dd HH:mm:ss');
    String formattedDate = formatter.format(DateTime.now());

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Formatted Date and Time'),
        ),
        body: Center(
          child: Text(
            'Formatted Date and Time: $formattedDate',
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
    );
  }
}

使用 flutter_localizations 插件进行本地化

虽然flutter_localizations本身不直接处理日期和时间,但它与intl一起使用可以提供本地化的日期和时间格式。

pubspec.yaml中确保包含flutter_localizations

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

在应用的MaterialApp中启用本地化支持:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', 'US'),
        Locale('zh', 'CN'),
      ],
      home: Scaffold(
        appBar: AppBar(
          title: Text('Localized Date and Time'),
        ),
        body: Builder(
          builder: (context) {
            Locale locale = Localizations.localeOf(context);
            String localizedDateFormat =
                locale.languageCode == 'zh' ? 'yyyy年MM月dd日 HH:mm:ss' : 'yyyy-MM-dd HH:mm:ss';
            DateFormat formatter = DateFormat(localizedDateFormat);
            String formattedDate = formatter.format(DateTime.now());

            return Center(
              child: Text(
                'Localized Date and Time: $formattedDate',
                style: TextStyle(fontSize: 20),
              ),
            );
          },
        ),
      ),
    );
  }
}

这些代码示例展示了如何在Flutter应用中获取和格式化当前日期和时间,以及如何通过intlflutter_localizations插件支持本地化。

回到顶部