Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker

摘要:
今天,我们来谈谈Flutter中的日期和日期选择器。Flutter中的日期和时间戳//日期和时间标记转换var_nowTime=DateTime。now();//获取当前时间打印(_nowTime);打印(_nowDate.minisecondsSinceEpoch);//13位时间戳1575389234667打印(DateTime.fromMillisecondsSinceEpoc

今天我们来聊聊Flutter中的日期和日期选择器。

Flutter中的日期和时间戳

//日期时间戳转换
var _nowTime = DateTime.now();//获取当前时间
print(_nowTime);
print(_nowDate.millisecondsSinceEpoch); //13位时间戳 1575389234667
print(DateTime.fromMillisecondsSinceEpoch(1575389234667)); //时间戳转为日期2019-12-03 16:07:14.667

展示一个时间,会有多种形式,比如1970-01-01、1970/01/01、1970年01月01日,等等,那么我们如何把同一个时间根据需要转换成不同的格式呢?接下来我就为大家介绍一个Flutter中的第三方库。

Flutter的第三方库 date_format 

地址:https://pub.dev/packages/date_format

添加依赖:date_format: ^1.0.8 

引入:

import 'package:date_format/date_format.dart';

简单来个例子,代码如下:

print(formatDate(DateTime.now(), [yyyy, "", mm, "", dd])); //2019年12月03

在开发项目的时候,我们经常会遇到选择时间或者选择日期的场景,接下来我将为大家介绍Flutter中自带的日期选择器和时间选择器。

调用Flutter自带的日期选择器组件和时间选择器组件

调起日期选择器的方法showDatePicker的返回值是Future,Future是一个异步类型,因此showDatePicker是一个异步方法。而要获取异步方法里面的数据,有两种方式。

1、获取异步方法里面的值的第一种方式:then

_showDatePicker(){
    showDatePicker(
      context: context,
      initialDate: _nowDate, //选中的日期
      firstDate: DateTime(1900), //日期选择器上可选择的最早日期
      lastDate: DateTime(2100), //日期选择器上可选择的最晚日期
    ).then((result){
      print(result);
    });
 }

2、获取异步方法里面的值的第二种方式:async+await

 _showDatePicker() async{
    var result = await showDatePicker(
      context: context,
      initialDate: _nowDate, //选中的日期
      firstDate: DateTime(1900), //日期选择器上可选择的最早日期
      lastDate: DateTime(2100), //日期选择器上可选择的最晚日期
    );
    print(result);
  }

两种方式都可以实现调用日期选择器。

Flutter自带的日期选择器是showDatePicker,时间选择器是showTimePicker。这两个选择器默认的显示效果都是英文的,我们是在中国,那么就需要将其显示成中文版的,这就涉及到Flutter的国际化的问题。

Flutter中的国际化

第一步:配置flutter_localizations依赖

找到pubspec.yaml,配置flutter_localizations:

flutter_localizations:
    sdk: flutter  

第二步:导入国际化的包flutter_localizations.dart

main.dart导入

import 'package:flutter_localizations/flutter_localizations.dart';

第三步,设置国际化

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      onGenerateRoute: prefix0.onGenerateRoute,
      initialRoute: "/",
      //配置如下两个国际化的参数
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
      ],
      supportedLocales: [
        const Locale("zh", "CH"),
        const Locale("en", "US")
      ],
    );
  }
}

如果操作系统是中文的,那么现在就可以显示中文了,如果操作系统不是中文的,那么还需要下面第四步。

第四步,在需要展示特定语言的组件中进行配置

//调起日期选择器
_showDatePicker() {
  showDatePicker(
    context: context,
    initialDate: _selectedDate, 
    firstDate: DateTime(1980), 
    lastDate: DateTime(2100),
    locale: Locale("zh")//中文显示
  ).then((selectedValue) {
    setState(() {
      if (selectedValue != null) {
        this._selectedDate = selectedValue;
      }
    });
  });
}

这样配置好了之后,效果如下:

Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker第1张

完整代码如下:

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

class DatePicker extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _DatePicker();
}

class _DatePicker extends State<DatePicker> {
  DateTime _nowDate = DateTime.now(); //当前日期
  TimeOfDay _nowTime = TimeOfDay.now(); //当前时间

  //调起日期选择器
  _showDatePicker(){
    //获取异步方法里面的值的第一种方式:then
    showDatePicker(
      //如下四个参数为必填参数
      context: context,
      initialDate: _nowDate, //选中的日期
      firstDate: DateTime(1900), //日期选择器上可选择的最早日期
      lastDate: DateTime(2100), //日期选择器上可选择的最晚日期
    ).then((result){
      print(result);
      //将选中的值传递出来
      setState(() {
        this._nowDate = result;
      });
    });
  }
  // _showDatePicker() async{
  //   // 获取异步方法里面的值的第二种方式:async+await
  //   //await的作用是等待异步方法showDatePicker执行完毕之后获取返回值
  //   var result = await showDatePicker(
  //     context: context,
  //     initialDate: _nowDate, //选中的日期
  //     firstDate: DateTime(1900), //日期选择器上可选择的最早日期
  //     lastDate: DateTime(2100), //日期选择器上可选择的最晚日期
  //   );
  //   print(result);
  //   setState(() {
  //     this._nowDate = result;
  //   });
  // }

  //调起时间选择器
  _showTimePicker() async{
    // 获取异步方法里面的值的第二种方式:async+await
    //await的作用是等待异步方法showDatePicker执行完毕之后获取返回值
    var result = await showTimePicker(
      context: context,
      initialTime: _nowTime, //选中的时间
    );
    print(result);
    //将选中的值传递出来
    setState(() {
      this._nowTime = result;
    });
  }
  
  @override
  Widget build(BuildContext context) {
    var _date = formatDate(_nowDate, [yyyy, "-", mm, "-", dd]);
    var _time = _nowTime.format(context);  
    return Scaffold(
      appBar: AppBar(title: Text("日期时间选择器")),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              InkWell(
                onTap:_showDatePicker,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text("${_date}"),
                    Icon(Icons.arrow_drop_down)
                  ],
                ),
              ),
              InkWell(
                onTap:_showTimePicker,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text("${_time}"),
                    Icon(Icons.arrow_drop_down)
                  ],
                ),
              ),
            ],
          )
        ],
      ),

    );
  }
}

调用Flutter的第三方时间选择器组件 

上面介绍了系统给我们提供的日期时间选择器,但是有时候系统提供的选择器并不符合我们的要求,这时我们就可以到pub.dev上去寻找符合我们要求的日期选择器。

这里我们介绍一款Cupertino风格(即iOS风格)的日期选择器——flutter_cupertino_date_picker。

地址:https://pub.dev/packages/flutter_cupertino_date_picker

添加依赖:flutter_cupertino_date_picker: ^1.0.12

新建dart页面,引入:

import 'package:flutter_cupertino_date_picker/flutter_cupertino_date_picker.dart';

这个插件提供了很多种格式,看你需要那种格式就找到那种格式的例子代码,看怎么使用。

1、首先date_picker_bottom_sheet为例

地址:https://github.com/dylanwuzh/flutter-cupertino-date-picker/blob/master/example/lib/date_picker_bottom_sheet.dart

一些引入date_format包,当前日期等参数我就不再写了。见上面代码

调起date_picker_bottom选择器,为了和上面的代码区分,我换了一个名字

//调起date_picker_bottom选择器
  _cupertinoPicker(){
    DatePicker.showDatePicker(
      context,
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
        confirm: Text('确定', style: TextStyle(color: Colors.red)), 
        cancel: Text('取消', style: TextStyle(color: Colors.cyan)),
      ),
      minDateTime: DateTime.parse('2010-05-12'), //起始日期
      maxDateTime: DateTime.parse('2021-11-25'), //终止日期
      initialDateTime: _nowDate, //当前日期
      dateFormat: 'yyyy-MMMM-dd',  //显示格式
      locale: DateTimePickerLocale.zh_cn, //语言 默认DateTimePickerLocale.en_us
      onClose: () => print("----- onClose -----"),
      onCancel: () => print('onCancel'),
      onChange: (dateTime, List<int> index) { //改变的时候
        setState(() {
          _nowDate = dateTime;
        });
      },
      onConfirm: (dateTime, List<int> index) { //确定的时候
        setState(() {
          _nowDate = dateTime;
        });
      },
    );
  }

效果图:

Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker第2张

完整代码如下:

import 'package:flutter/material.dart';
import 'package:date_format/date_format.dart';
import 'package:flutter_cupertino_date_picker/flutter_cupertino_date_picker.dart';

class CupertinoTimePage extends StatefulWidget {
  CupertinoTimePage({Key key}) : super(key: key);

  @override
  _CupertinoTimePageState createState() => _CupertinoTimePageState();
}

class _CupertinoTimePageState extends State<CupertinoTimePage> {
  DateTime _nowDate = DateTime.now(); //当前日期
  TimeOfDay _nowTime = TimeOfDay.now(); //当前时间

  //调起flutter_cupertino_date_picker选择器
  _cupertinoPicker(){
    DatePicker.showDatePicker(
      context,
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
        confirm: Text('确定', style: TextStyle(color: Colors.red)), 
        cancel: Text('取消', style: TextStyle(color: Colors.cyan)),
      ),
      minDateTime: DateTime.parse('2010-05-12'), //起始日期
      maxDateTime: DateTime.parse('2021-11-25'), //终止日期
      initialDateTime: _nowDate, //当前日期
      dateFormat: 'yyyy-MMMM-dd',  //显示格式
      locale: DateTimePickerLocale.zh_cn, //语言 默认DateTimePickerLocale.en_us
      onClose: () => print("----- onClose -----"),
      onCancel: () => print('onCancel'),
      onChange: (dateTime, List<int> index) { //改变的时候
        setState(() {
          _nowDate = dateTime;
        });
      },
      onConfirm: (dateTime, List<int> index) { //确定的时候
        setState(() {
          _nowDate = dateTime;
        });
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    var _date = formatDate(_nowDate, [yyyy, "-", mm, "-", dd]);return Scaffold(
      appBar: AppBar(title: Text("第三方IOS时间选择器演示页面")),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              InkWell(
                onTap: _cupertinoPicker,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text("${_date}"),
                    Icon(Icons.arrow_drop_down)
                  ],
                ),
              ),
            ]
          ),
        ]
      )        
    );
  }
}

 2、datetime_picker_bottom_sheet

地址:https://github.com/dylanwuzh/flutter-cupertino-date-picker/blob/master/example/lib/datetime_picker_bottom_sheet.dart

调起datetime_picker_bottom选择器
//调起datetime_picker_bottom选择器
  _cupertinoDateTimePicker(){
    DatePicker.showDatePicker(
      context,
      minDateTime: DateTime.parse('2010-05-12'), //起始日期
      maxDateTime: DateTime.parse('2021-11-25'), //终止日期
      initialDateTime: DateTime.parse(formatDate(_selectedDateTime, [yyyy, "-", mm, "-", "dd", " ", HH, ":", nn, ":", ss])), //当前日期时间
      dateFormat: "yyyy年M月d日    EEE,H时:m分", //显示格式
      locale: DateTimePickerLocale.zh_cn, //语言
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
      ),
      pickerMode: DateTimePickerMode.datetime, // show TimePicker
      onCancel: () {
        debugPrint('onCancel');
      },
      onChange: (dateTime, List<int> index) {
        setState(() {
          _nowDate = dateTime;
        });
      },
      onConfirm: (dateTime, List<int> index) {
        setState(() {
          _nowDate = dateTime;
        });
      },
    );
  }

效果图:

Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker第3张

完整代码:

import 'package:flutter/material.dart';
import 'package:date_format/date_format.dart';
import 'package:flutter_cupertino_date_picker/flutter_cupertino_date_picker.dart';

class CupertinoTimePage extends StatefulWidget {
  CupertinoTimePage({Key key}) : super(key: key);

  @override
  _CupertinoTimePageState createState() => _CupertinoTimePageState();
}

class _CupertinoTimePageState extends State<CupertinoTimePage> {
  DateTime _nowDate = DateTime.now(); //当前日期
  DateTime _nowDateTime = DateTime.parse(formatDate(DateTime.now(), [yyyy, "-", mm, "-", "dd", " ", HH, ":", nn, ":", ss])); //当前日期时间

  //调起date_picker_bottom选择器
  _cupertinoPicker(){
    DatePicker.showDatePicker(
      context,
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
        confirm: Text('确定', style: TextStyle(color: Colors.red)), 
        cancel: Text('取消', style: TextStyle(color: Colors.cyan)),
      ),
      minDateTime: DateTime.parse('2010-05-12'), //起始日期
      maxDateTime: DateTime.parse('2021-11-25'), //终止日期
      initialDateTime: _nowDate, //当前日期
      dateFormat: 'yyyy-MMMM-dd',  //显示格式
      locale: DateTimePickerLocale.zh_cn, //语言 默认DateTimePickerLocale.en_us
      onClose: () => print("----- onClose -----"),
      onCancel: () => print('onCancel'),
      onChange: (dateTime, List<int> index) { //改变的时候
        setState(() {
          _nowDate = dateTime;
        });
      },
      onConfirm: (dateTime, List<int> index) { //确定的时候
        setState(() {
          _nowDate = dateTime;
        });
      },
    );
  }

  //调起datetime_picker_bottom选择器
  _cupertinoDateTimePicker(){
    DatePicker.showDatePicker(
      context,
      minDateTime: DateTime.parse('2010-05-12'), //起始日期
      maxDateTime: DateTime.parse('2021-11-25'), //终止日期
      //initialDateTime: DateTime.parse(formatDate(_selectedDateTime, [yyyy, "-", mm, "-", "dd", " ", HH, ":", nn, ":", ss])),
      initialDateTime: _nowDateTime, //当前日期时间
      dateFormat: "yyyy年M月d日    EEE,H时:m分", //显示格式
      locale: DateTimePickerLocale.zh_cn, //语言
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
      ),
      pickerMode: DateTimePickerMode.datetime, // show TimePicker
      onCancel: () {
        debugPrint('onCancel');
      },
      onChange: (dateTime, List<int> index) {
        setState(() {
          _nowDate = dateTime;
        });
      },
      onConfirm: (dateTime, List<int> index) {
        setState(() {
          _nowDate = dateTime;
        });
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    var _date = formatDate(_nowDate, [yyyy, "-", mm, "-", dd]);
    var _datetime = formatDate(_nowDate,[yyyy, "-", mm, "-", dd, " ", HH, ":", nn]);
    return Scaffold(
      appBar: AppBar(title: Text("第三方IOS时间选择器演示页面")),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              InkWell(
                onTap: _cupertinoPicker,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text("${_date}"),
                    Icon(Icons.arrow_drop_down)
                  ],
                ),
              ),
            ]
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              InkWell(
                onTap: _cupertinoDateTimePicker,
                child: Row(
                  children: <Widget>[
                    Text('${_datetime}'),
                    Icon(Icons.arrow_drop_down)
                  ],
                ),
              )
            ],
          )
        ]
      )        
    );
  }
}

免责声明:文章转载自《Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇2/3 初次搭建 Vue 项目遇到的问题汇总【转】bootstrap popover 如何在hover状态移动到弹出上不消失下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Shell脚本编程(一)

shell 脚本编程(一) 1 . shell 的作用 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地...

Java获取两个指定日期之间的所有月份(查询两个月份之间的相隔)

Java获取两个指定日期之间的所有月份String y1 = "2016-02";// 开始时间 String y2 = "2019-12";// 结束时间 try { Date startDate = new SimpleDateFormat("yyyy-MM").parse(y1); Date endDate = new SimpleDateForm...

iOS ASA 的归因技术支持_Swift

ASA简介苹果ASA搜索广告服务已全面上线,在App Store中搜索关键词,搜索结果的顶部会出现带有“广告”标识的App展示。 ASA拥有高转化率、低成本、用户精准、流量安全等优势,是一个相当重要的获量渠道。ASA不知道是什么请看这里 https://ads.apple.com/cn/?cid=BD-BZ-Desktop-SC-CN-001 ASA投放...

go第三方日志系统-seelog-Basic sections

https://github.com/cihub/seelog 文档学习:https://github.com/cihub/seelog/wiki 1.安装: go get github.com/cihub/seelog 2.快速启动 Seelog的设计非常方便。它的默认配置和包级别的日志记录器是现成的,所以开始你只需要两行代码: package main...

vue实例获取当前系统时间

vue实例获取当前系统时间 效果图:  代码: <template> <div class="home1-3-1 clearfix"> <span>{{ nowDate }}</span> <p> <em>{{ nowYear }}.{{ no...

ECSHOP模糊分词搜索和商品列表关键字飘红功能

ECSHOP联想下拉框 1、修改page_header.lbi模版文件,将搜索文本框修改为: <input name="keywords"type="text"id="keyword"value="<!--{if ($search_keywords neq "")}{$search_keywords|escape}--><!--...