Flutter时间处理插件millisecs的使用

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

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 函数外,还可以使用 parseformat 函数进行解析和格式化:

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
  • 直接的 parseformat 函数也被暴露出来,ms 是基于它们构建的。
  • 扩展方法可用于直接在字符串和数字上调用方法。

其他信息

四舍五入

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

动态类型

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

格式化为周和年

在原始代码(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_formatintl等用于日期时间处理的包),但我可以给你一个使用类似功能插件的示例代码,展示如何在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包或其他流行的日期时间处理库来满足。

回到顶部