Flutter时间格式化插件humanize_duration的使用

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

Flutter时间格式化插件humanize_duration的使用

Humanize Duration 是一个用于将时间间隔转换为可读格式的Flutter插件,灵感来自于 humanizeDuration.js

安装和使用

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

dependencies:
  humanize_duration: any # 或者最新的版本号

然后运行 flutter pub get 来安装该插件。

基本用法

默认情况下,Humanize Duration 会将时间间隔精确到毫秒,并且默认使用英语进行显示。

import 'package:humanize_duration/humanize_duration.dart';

void main() {
  print(humanizeDuration(const Duration(milliseconds: 3000))); // 输出:'3 seconds'
  print(humanizeDuration(const Duration(milliseconds: 97320000))); // 输出:'1 day, 3 hours, 2 minutes'
}

选项和语言支持

支持的语言

Humanize Duration 支持多种语言,例如阿拉伯语、法语、英语、西班牙语等。可以通过 getSupportedLanguages() 方法获取支持的语言列表。

print(getSupportedLanguages()); // 输出:[ar, en, fr, es, jp, gr, du, fa, ge, it, ko, pt, ru, tr, zh_cn, zh_tw]

使用特定语言

可以指定语言来格式化时间:

import 'package:humanize_duration/humanize_duration.dart';
import 'package:humanize_duration/src/languages/ar_language.dart'; // 导入阿拉伯语支持

void main() {
  print(humanizeDuration(
    const Duration(milliseconds: 97320000),
    language: const ArLanguage(),
  )); // 输出:'١ يوم , ٣ ساعات'

  // 或者通过语言代码获取语言
  print(humanizeDuration(
    const Duration(milliseconds: 97320000),
    language: getLanguageByLocale('ar'),
  ));
}

添加自定义语言

要添加自定义语言,需要实现 HumanizeLanguage 类:

import 'package:humanize_duration/humanize_duration.dart';

class EuLanguage implements HumanizeLanguage {
  const EuLanguage();

  @override
  String name() => 'eu';

  @override
  String day(int value) => 'egun';

  @override
  String hour(int value) => 'ordu';

  @override
  String millisecond(int value) => 'milisegundo';

  @override
  String minute(int value) => 'minutu';

  @override
  String month(int value) => 'hilabete';

  @override
  String second(int value) => 'segundo';

  @override
  String week(int value) => 'aste';

  @override
  String year(int value) => 'urte';
}

其他选项

分隔符 (delimiter)

可以在不同单位之间设置分隔符:

print(humanizeDuration(
  const Duration(milliseconds: 97320000),
  options: const HumanizeOptions(delimiter: ' -- '),
)); // 输出:'1 day -- 3 hours -- 2 minutes'

单位间隔 (spacer)

可以在每个值和单位之间设置间隔字符串:

print(humanizeDuration(
  const Duration(milliseconds: 22140000),
  options: const HumanizeOptions(spacer: ' whole '),
)); // 输出:'6 whole hours, 9 whole minutes'

单位选择 (units)

可以选择特定的单位进行显示:

print(humanizeDuration(
  const Duration(milliseconds: 3600000),
  options: const HumanizeOptions(units: [Units.hour]),
)); // 输出:'1 hour'

print(humanizeDuration(
  const Duration(milliseconds: 3600000),
  options: const HumanizeOptions(units: [Units.minute]),
)); // 输出:'60 minutes'

连接词 (conjunction)

可以在最后的单位之前设置连接词,并控制是否保留最后一个逗号:

print(humanizeDuration(
  const Duration(milliseconds: 22141000),
  options: const HumanizeOptions(conjunction: ' and ', lastPrefixComma: true),
)); // 输出:'6 hours, 9 minutes, and 1 second'

示例 Demo

以下是一个完整的示例程序,展示了如何使用 humanize_duration 插件:

import 'package:flutter/material.dart';
import 'package:humanize_duration/humanize_duration.dart';
import 'package:humanize_duration/src/languages/ar_language.dart'; // 阿拉伯语支持

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Humanize Duration Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                humanizeDuration(const Duration(milliseconds: 3000)),
                style: TextStyle(fontSize: 24),
              ),
              Text(
                humanizeDuration(const Duration(milliseconds: 97320000), language: const ArLanguage()),
                style: TextStyle(fontSize: 24),
              ),
              Text(
                humanizeDuration(
                  const Duration(milliseconds: 22140000),
                  options: const HumanizeOptions(spacer: ' whole '),
                ),
                style: TextStyle(fontSize: 24),
              ),
              Text(
                humanizeDuration(
                  const Duration(milliseconds: 22141000),
                  options: const HumanizeOptions(conjunction: ' and ', lastPrefixComma: true),
                ),
                style: TextStyle(fontSize: 24),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何使用 humanize_duration 插件来格式化不同的时间间隔,并支持多语言和其他自定义选项。


更多关于Flutter时间格式化插件humanize_duration的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter时间格式化插件humanize_duration的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用humanize_duration插件来对时间进行格式化的示例代码。humanize_duration插件能够将时间长度(例如秒数)转换为更易读的格式,如“3分钟”,“2小时”等。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  humanize_duration: ^2.0.0  # 请确保使用最新版本

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

步骤 2: 导入并使用插件

在你的Flutter项目中,导入humanize_duration并使用它。下面是一个完整的示例代码,展示了如何将秒数格式化为更易读的字符串:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Humanize Duration Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Humanize Duration Example'),
        ),
        body: Center(
          child: HumanizeDurationExample(),
        ),
      ),
    );
  }
}

class HumanizeDurationExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 示例秒数
    final int totalSeconds = 7385; // 例如,7385秒

    // 使用humanize_duration插件格式化时间
    final String humanizedDuration = Humanize.duration(
      Duration(seconds: totalSeconds),
      configuration: DurationConfiguration(
        quantityThreshold: 2, // 阈值,表示显示的最大单位数量
        unitSeparator: ', ',
        spaceUnits: true,
        decimalPlaces: 1, // 小数位数
        minimalUnit: DurationUnit.seconds, // 最小的单位
        languageCode: 'en', // 语言代码
      ),
    );

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'Total Seconds: $totalSeconds',
          style: TextStyle(fontSize: 20),
        ),
        SizedBox(height: 20),
        Text(
          'Humanized Duration: $humanizedDuration',
          style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
        ),
      ],
    );
  }
}

// 自定义Column组件,因为直接使用Column会导致布局问题,这里只是为了简单演示
class Column extends StatelessWidget {
  final MainAxisAlignment mainAxisAlignment;
  final List<Widget> children;

  Column({required this.mainAxisAlignment, required this.children});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        width: 300,
        child: Column(
          mainAxisAlignment: mainAxisAlignment,
          children: children,
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加humanize_duration依赖。
  2. 导入插件:在需要使用的Dart文件中导入humanize_duration
  3. 使用插件:使用Humanize.duration方法将秒数(或Duration对象)格式化为更易读的字符串。
  4. 配置选项DurationConfiguration类允许你自定义格式化的输出,例如显示的最大单位数量、单位分隔符、小数位数等。

运行上述代码后,你将看到一个简单的Flutter应用,它显示了原始秒数和经过humanize_duration插件格式化后的时间字符串。

回到顶部