Flutter时间处理插件millisecs的使用

Flutter时间处理插件millisecs的使用

millisecs 插件用于将各种时间格式转换为毫秒数,并且可以将毫秒数转换回时间格式。它是 Vercel 的 ms npm 包在 Dart 和 Flutter 中的适配版本。

使用方法

导入

首先需要导入 millisecs 包:

import 'package:millisecs/millisecs.dart';

从时间格式转换到毫秒数

你可以将各种时间格式(如天、小时、分钟等)转换为毫秒数:

ms('2 days');  // 172800000
ms('1d');      // 86400000
ms('10h');     // 36000000
ms('2.5 hrs'); // 9000000.0
ms('2h');      // 7200000
ms('1m');      // 60000
ms('5s');      // 5000
ms('1y');      // 31557600000.0
ms('100');     // 100
ms('-3 days'); // -259200000
ms('-1h');     // -3600000
ms('-200');    // -200

从毫秒数转换到时间格式

你也可以将毫秒数转换为时间格式字符串:

ms(60000);             // "1m"
ms(2 * 60000);         // "2m"
ms(-3 * 60000);        // "-3m"
ms(ms('10 hours'));    // "10h"

带有长格式的时间格式

millisecs 还支持带长格式的时间字符串:

ms(60000, long: true);             // "1 minute"
ms(2 * 60000, long: true);         // "2 minutes"
ms(-3 * 60000, long: true);        // "-3 minutes"
ms(ms('10 hours'), long: true);    // "10 hours"

解析和格式化

除了直接调用 ms 函数外,还可以使用 parse 和 format 函数进行解析和格式化:

parse('1h');                     // 3600000
format(2000);                    // "2s"
format(2000, long: true);        // "2 seconds"

tryParse('1h');                  // 3600000
tryFormat(2000);                 // "2s"

tryParse('🎯');                 // null
tryFormat(double.infinity);      // null

扩展方法

millisecs 提供了一些扩展方法,可以直接在字符串和数字上调用:

'2.5 hrs'.parseMS();              // 9000000.0
'1y'.parseMS();                   // 31557600000.0
'100'.parseMS();                  // 100
'-3 days'.parseMS();              // -259200000

'10 hours'.parseMS().formatMS();  // "10h"
6000.formatMS();                  // "2m"
(2 * 60000).formatMS(long: true); // "2 minutes"

'1h'.tryParseMS();                // 3600000
'🎯'.tryParseMS();               // null
2000.tryFormatMS();               // "2s"
double.infinity.tryFormatMS();    // null

特性

  • 该插件在 Dart 和 Flutter 中均可使用。
  • 如果传入一个包含数字和有效单位的字符串,则返回相应的毫秒数。
  • 如果传入一个纯数字字符串,则返回该数字本身(例如,'100' 返回 100)。
  • 如果传入一个数字,则返回带有单位的时间字符串。
  • ms 函数会抛出 ArgumentError 错误,如果传入无效的字符串或非有限数值。
  • 可以使用 tryMS 替代 ms 来返回 null 而不是抛出错误。
  • 解析时大小写不敏感,所以 '2.5 hrs' 和 '2.5 HRs' 都会被解析为 9000000。
  • 直接的 parse 和 format 函数也被暴露出来,ms 是基于它们构建的。
  • 扩展方法可用于直接在字符串和数字上调用方法。

其他信息

四舍五入

在格式化时,数值会根据需要四舍五入。例如,ms(1499) 将输出 "1s",而 ms(1500) 将输出 "2s"。

动态类型

ms 函数的参数和返回值都具有 dynamic 类型。这是因为在 Dart 中,目前没有原生支持联合类型的简单方式(如 TypeScript 中的联合类型)。因此,ms 使用了 dynamic 类型来允许多种类型(字符串和数字)的输入和输出。如果你需要更严格的类型控制,可以使用扩展方法或 parse 和 format 函数。

格式化为周和年

在原始代码(Vercel 的代码)中,解析可以达到年份级别,但格式化只到天。然而,在这个 Dart 实现中,格式化包括了周和年,与解析保持一致。如果你习惯于 JavaScript 中的格式化字符串(不包含周和年),请注意在 Dart 中这些格式化字符串是故意包含周和年的。

贡献

如果有任何问题、功能请求或增强需求,请打开一个 Issue 或发送一个 Pull Request。

完整示例

以下是一个完整的 Flutter 应用示例,展示了如何使用 millisecs 插件的各种功能:

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Testing "millisecs" Package',
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Testing "millisecs" Package'),
      ),
      body: ListView(
        padding: const EdgeInsets.all(16),
        children: [
          Text('Convert from Time Formats',
              style: Theme.of(context).textTheme.titleMedium),
          ListTile(
            title: const Text("ms('2 days')"),
            trailing: Text('${ms('2 days')}'),
          ),
          ListTile(
            title: const Text("ms('1d')"),
            trailing: Text('${ms('1d')}'),
          ),
          ListTile(
            title: const Text("ms('10h')"),
            trailing: Text('${ms('10h')}'),
          ),
          ListTile(
            title: const Text("ms('2.5 hrs')"),
            trailing: Text('${ms('2.5 hrs')}'),
          ),
          ListTile(
            title: const Text("ms('2h')"),
            trailing: Text('${ms('2h')}'),
          ),
          ListTile(
            title: const Text("ms('1m')"),
            trailing: Text('${ms('1m')}'),
          ),
          ListTile(
            title: const Text("ms('5s')"),
            trailing: Text('${ms('5s')}'),
          ),
          ListTile(
            title: const Text("ms('1y')"),
            trailing: Text('${ms('1y')}'),
          ),
          ListTile(
            title: const Text("ms('100')"),
            trailing: Text('${ms('100')}'),
          ),
          ListTile(
            title: const Text("ms('-3 days')"),
            trailing: Text('${ms('-3 days')}'),
          ),
          ListTile(
            title: const Text("ms('1h')"),
            trailing: Text('${ms('1h')}'),
          ),
          ListTile(
            title: const Text("ms('-200')"),
            trailing: Text('${ms('-200')}'),
          ),
          const SizedBox(height: 32),
          Text('Convert from Milliseconds',
              style: Theme.of(context).textTheme.titleMedium),
          ListTile(
            title: const Text('ms(60000)'),
            trailing: Text('${ms(60000)}'),
          ),
          ListTile(
            title: const Text('ms(2 * 60000)'),
            trailing: Text('${ms(2 * 60000)}'),
          ),
          ListTile(
            title: const Text('ms(-3 * 60000)'),
            trailing: Text('${ms(-3 * 60000)}'),
          ),
          ListTile(
            title: const Text("ms(ms('10 hours'))"),
            trailing: Text('${ms(ms('10 hours'))}'),
          ),
          const SizedBox(height: 32),
          Text('Time Format Written-Out',
              style: Theme.of(context).textTheme.titleMedium),
          ListTile(
            title: const Text('ms(60000, long: true)'),
            trailing: Text('${ms(60000, long: true)}'),
          ),
          ListTile(
            title: const Text('ms(2 * 60000, long: true)'),
            trailing: Text('${ms(2 * 60000, long: true)}'),
          ),
          ListTile(
            title: const Text('ms(-3 * 60000, long: true)'),
            trailing: Text('${ms(-3 * 60000, long: true)}'),
          ),
          ListTile(
            title: const Text("ms(ms('10 hours'), long: true)"),
            trailing: Text('${ms(ms('10 hours'), long: true)}'),
          ),
          const SizedBox(height: 32),
          Text('parse and format',
              style: Theme.of(context).textTheme.titleMedium),
          ListTile(
            title: const Text("parse('1h')"),
            trailing: Text('${parse('1h')}'),
          ),
          ListTile(
            title: const Text('format(2000)'),
            trailing: Text(format(2000)),
          ),
          ListTile(
            title: const Text('format(2000, long: true)'),
            trailing: Text(format(2000, long: true)),
          ),
          const SizedBox(height: 16),
          ListTile(
            title: const Text("tryParse('1h')"),
            trailing: Text('${tryParse('1h')}'),
          ),
          ListTile(
            title: const Text('tryFormat(2000)'),
            trailing: Text('${tryFormat(2000)}'),
          ),
          const SizedBox(height: 16),
          ListTile(
            title: const Text("tryParse('🎯')"),
            trailing: Text('${tryParse('🎯')}'),
          ),
          ListTile(
            title: const Text('tryFormat(double.infinity)'),
            trailing: Text('${tryFormat(double.infinity)}'),
          ),
          const SizedBox(height: 32),
          Text('Extensions', style: Theme.of(context).textTheme.titleMedium),
          ListTile(
            title: const Text("'2.5 hrs'.parseMS()"),
            trailing: Text('${'2.5 hrs'.parseMS()}'),
          ),
          ListTile(
            title: const Text("'1y'.parseMS()"),
            trailing: Text('${'1y'.parseMS()}'),
          ),
          ListTile(
            title: const Text("'100'.parseMS()"),
            trailing: Text('${'100'.parseMS()}'),
          ),
          ListTile(
            title: const Text("'-3 days'.parseMS()"),
            trailing: Text('${'-3 days'.parseMS()}'),
          ),
          const SizedBox(height: 16),
          ListTile(
            title: const Text("'10 hours'.parseMS().formatMS()"),
            trailing: Text('10 hours'.parseMS().formatMS()),
          ),
          ListTile(
            title: const Text('6000.formatMS()'),
            trailing: Text(6000.formatMS()),
          ),
          ListTile(
            title: const Text('(2 * 6000).formatMS(long: true)'),
            trailing: Text((2 * 6000).formatMS(long: true)),
          ),
          const SizedBox(height: 16),
          ListTile(
            title: const Text("'1h'.tryParseMS()"),
            trailing: Text('${'1h'.tryParseMS()}'),
          ),
          ListTile(
            title: const Text("'🎯'.tryParseMS()"),
            trailing: Text('${'🎯'.tryParseMS()}'),
          ),
          ListTile(
            title: const Text('2000.tryFormatMS()'),
            trailing: Text('${2000.tryFormatMS()}'),
          ),
          ListTile(
            title: const Text('double.infinity.tryFormatMS()'),
            trailing: Text('${double.infinity.tryFormatMS()}'),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


在Flutter中,处理时间的插件有很多,其中millisecs是一个可以方便地进行时间计算和格式化的插件。虽然millisecs这个具体的包名在Flutter社区中可能不是特别常见(可能指的是类似功能的包,比如date_format、intl等用于日期时间处理的包),但我可以给你一个使用类似功能插件的示例代码,展示如何在Flutter中处理时间。

这里,我将使用intl包作为示例,因为它是一个非常流行且功能强大的日期时间处理库。

首先,你需要在pubspec.yaml文件中添加intl依赖:

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

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

接下来,是一个使用intl包进行时间处理的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Time Handling Example'),
        ),
        body: Center(
          child: TimeHandlingExample(),
        ),
      ),
    );
  }
}

class TimeHandlingExample extends StatefulWidget {
  @override
  _TimeHandlingExampleState createState() => _TimeHandlingExampleState();
}

class _TimeHandlingExampleState extends State<TimeHandlingExample> {
  DateTime _currentTime = DateTime.now();
  String _formattedTime = '';

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

  void _formatTime() {
    // 使用intl包格式化时间
    DateFormat formatter = DateFormat('yyyy-MM-dd HH:mm:ss');
    setState(() {
      _formattedTime = formatter.format(_currentTime);
    });
  }

  void _addMilliseconds(int milliseconds) {
    setState(() {
      _currentTime = _currentTime.add(Duration(milliseconds: milliseconds));
      _formatTime();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'Current Formatted Time: $_formattedTime',
          style: TextStyle(fontSize: 24),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () => _addMilliseconds(1000), // 增加1秒
          child: Text('Add 1 Second'),
        ),
        SizedBox(height: 10),
        ElevatedButton(
          onPressed: () => _addMilliseconds(60000), // 增加1分钟
          child: Text('Add 1 Minute'),
        ),
        SizedBox(height: 10),
        ElevatedButton(
          onPressed: () => _addMilliseconds(3600000), // 增加1小时
          child: Text('Add 1 Hour'),
        ),
      ],
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用intl包来格式化当前时间。
  2. 创建了一个按钮,点击后可以增加指定的毫秒数到当前时间,并重新格式化显示。

如果你确实是在寻找一个名为millisecs的特定包,并且它提供了不同的API,你可能需要查阅该包的官方文档或GitHub仓库来获取具体的用法。不过,大多数日期时间处理的需求都可以通过intl包或其他流行的日期时间处理库来满足。

回到顶部