Flutter(二十):時間

1 時間戳和日期相互轉(zhuǎn)換

利用 date_format 庫進(jìn)行日期格式化。

@override
void initState() {
  var now = DateTime.now();
  print(now); // 2019-06-08 12:08:10.140421

  print(now.millisecondsSinceEpoch); //1559967090998 日期轉(zhuǎn)化成時間戳

  print(DateTime.fromMillisecondsSinceEpoch(1559967090998)); //2019-06-08 12:11:30.998 時間戳轉(zhuǎn)化成日期

  // 2019-06-08   2019/06/08   2019年06月08

  print(formatDate(DateTime.now(), [yyyy, '年', mm, '月', dd])); //2019年06月08耙箍,使用 date_format 庫格式化
}

2 調(diào)用 flutter 自帶日期組件和時間組件

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

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

  _FormDemoPageState createState() => _FormDemoPageState();
}

class _FormDemoPageState extends State<FormDemoPage> {
  DateTimePickerLocale _locale = DateTimePickerLocale.zh_cn;

  DateTime _dateTime = DateTime.now();

  _showDatePicker() async {
    //  showDatePicker(
    //    context:context,
    //    initialDate:_nowDate,
    //    firstDate:DateTime(1980),
    //    lastDate:DateTime(2100),
    //  ).then((result){
    //     print(result);
    //  });

    var result = await showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(1980),
      lastDate: DateTime(2100),
      //  locale: Locale('zh'),      //非必須
    );
    print(result); // 2020-07-09 00:00:00.000
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("測試"),
      ),
      body: Padding(
        padding: EdgeInsets.all(10),
        child: Column(
          children: <Widget>[
            SizedBox(height: 40),
            InkWell(
              child: Container(
                child: Text("${formatDate(_dateTime, [yyyy,'-',mm,'-',dd,' ',HH,':',nn,':',ss])}"),
              ),
              onTap: this._showDatePicker,
            ),
          ],
        ),
      ),
    );
  }
}

效果
  • 時間組件
import 'package:flutter/material.dart';
import 'package:date_format/date_format.dart';

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

  _FormDemoPageState createState() => _FormDemoPageState();
}

class _FormDemoPageState extends State<FormDemoPage> {
  DateTimePickerLocale _locale = DateTimePickerLocale.zh_cn;

  var _nowTime = TimeOfDay(hour: 12, minute: 20);

  _showTimePicker() async {
    var result = await showTimePicker(context: context, initialTime: _nowTime);
    print(result); // TimeOfDay(21:45)
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("測試"),
      ),
      body: Padding(
        padding: EdgeInsets.all(10),
        child: Column(
          children: <Widget>[
            SizedBox(height: 40),
            InkWell(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text("${_nowTime.format(context)}"),
                  Icon(Icons.arrow_drop_down)
                ],
              ),
              onTap: _showTimePicker,
            )
          ],
        ),
      ),
    );
  }
}

效果

3 國際化(中文)

參考:http://www.ptbird.cn/flutter-localizations-date-pick-chinese.html

  • 1 引入 flutter_localizations
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  • 2 指定 MaterialApp的localizationsDelegates 和 supportedLocales
import 'package:flutter_localizations/flutter_localizations.dart';

new MaterialApp(
 localizationsDelegates: [
   // ... app-specific localization delegate[s] here
   GlobalMaterialLocalizations.delegate,
   GlobalWidgetsLocalizations.delegate,
 ],
 supportedLocales: [
    const Locale('zh', 'CH'),
    // const Locale('en', 'US'), // 如果引入 iOS 還是英文
  ],
  // ...
)

如果 iOS 模擬器,注意把模擬器語言調(diào)整為中文<病!!

效果

4 使用第三方 flutter_cupertino_date_picker 日期組件

抽離日期組件

DateTime.dart

/*
 * Author: lin.zehong 
 * Date: 2020-07-03 17:15:04 
 * Desc: 日期時間組件
 */
import 'package:flutter/material.dart';
import 'package:flutter_cupertino_date_picker/flutter_cupertino_date_picker.dart';

const String MIN_DATE = '1980-01-01';
const String MAX_DATE = '2100-01-01';
const String FORMAT_DATE = 'yyyy-MMMM-dd';
const String MIN_DATETIME = '1980-01-01 09:00:00';
const String MAX_DATETIME = '2100-00-01 21:00:00';
const String FORMAT_DATETIME = 'yyyy-MM-dd HH時:mm分';
// const String FORMAT_DATETIME = 'yyyy-MM-dd HH時:mm分:ss秒';

// const String _format = 'yyyy年MM月dd日    H時:m分';
// const String _format = 'yy年M月d日    EEE,H時:m分';

class DateTimePage {
  DateTimePickerLocale _locale = DateTimePickerLocale.zh_cn;
  // DateTime _dateTime = DateTime.now();

  @required
  BuildContext context;
  String format;
  Function onConfirm;
  Function onClose;
  Function onCancel;
  DateTime initialDateTime;

  DateTimePage(
    this.context, {
    this.initialDateTime,
    this.format,
    this.onConfirm,
    this.onCancel,
    this.onClose,
  });

  // 日期
  void showDatePicker() {
    DatePicker.showDatePicker(
      context,
      onMonthChangeStartWithFirstDate: true,
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
        cancel: Text('取消', style: TextStyle(color: Colors.blue)),
        confirm: Text('確定', style: TextStyle(color: Colors.blue)),
      ),
      minDateTime: DateTime.parse(MIN_DATE),
      maxDateTime: DateTime.parse(MAX_DATE),
      initialDateTime: this.initialDateTime,
      // pickerMode: DateTimePickerMode.time, // show TimePicker
      locale: _locale,
      dateFormat: this.format ?? FORMAT_DATE,
      onClose: onClose,
      onCancel: onCancel,
      onConfirm: (dateTime, List<int> index) {
        this.onConfirm(dateTime);
      },
    );
  }

  // 日期時間
  void showDateTimePicker() {
    DatePicker.showDatePicker(
      context,
      onMonthChangeStartWithFirstDate: true,
      pickerTheme: DateTimePickerTheme(
        showTitle: true,
        cancel: Text('取消', style: TextStyle(color: Colors.blue)),
        confirm: Text('確定', style: TextStyle(color: Colors.blue)),
      ),
      minDateTime: DateTime.parse(MIN_DATETIME),
      maxDateTime: DateTime.parse(MAX_DATETIME),
      initialDateTime: this.initialDateTime,
      pickerMode: DateTimePickerMode.time, // show TimePicker
      locale: _locale,
      dateFormat: this.format ?? FORMAT_DATETIME,
      onClose: onClose,
      onCancel: onCancel,
      onConfirm: (dateTime, List<int> index) {
        this.onConfirm(dateTime);
      },
    );
  }
}

Test.dart 使用

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

import 'package:app03/components/DateTime/DateTime.dart';

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

  _FormDemoPageState createState() => _FormDemoPageState();
}

class _FormDemoPageState extends State<FormDemoPage> {
  DateTimePickerLocale _locale = DateTimePickerLocale.zh_cn;

  DateTime _dateTime = DateTime.now();

  void _showDatePicker() {
    DateTimePage(
      context,
      onConfirm: this.onConfirm,
      // initialDateTime: DateTime.parse('2000-05-15 09:23:10'),
      // format: "yyyy-MM-dd HH時:mm分:ss秒",
      // onCancel: () => print('onCancel'),
      // onClose: () => print('onColse'),
    ).showDateTimePicker();
  }

  void onConfirm(dateTime) {
    print(dateTime); // 2020-07-03 22:33:56.000
    setState(() {
      _dateTime = dateTime;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("測試"),
      ),
      body: Padding(
        padding: EdgeInsets.all(10),
        child: Column(
          children: <Widget>[
            SizedBox(height: 40),
            InkWell(
              child: Container(
                child:
                    Text("${formatDate(_dateTime, [yyyy, '-', mm, '-', dd])}"),
              ),
              onTap: this._showDatePicker,
            ),
          ],
        ),
      ),
    );
  }
}

效果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末西设,一起剝皮案震驚了整個濱河市瓣铣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贷揽,老刑警劉巖棠笑,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禽绪,居然都是意外死亡蓖救,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門印屁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來循捺,“玉大人,你說我怎么就攤上這事雄人〈娱伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵柠衍,是天一觀的道長洋满。 經(jīng)常有香客問我,道長珍坊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任正罢,我火速辦了婚禮阵漏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翻具。我一直安慰自己履怯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布裆泳。 她就那樣靜靜地躺著叹洲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪工禾。 梳的紋絲不亂的頭發(fā)上运提,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音闻葵,去河邊找鬼民泵。 笑死,一個胖子當(dāng)著我的面吹牛槽畔,可吹牛的內(nèi)容都是我干的栈妆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳞尔!你這毒婦竟也來了嬉橙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寥假,失蹤者是張志新(化名)和其女友劉穎憎夷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧旨,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾给,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔沃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒋得。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乒疏,靈堂內(nèi)的尸體忽然破棺而出额衙,到底是詐尸還是另有隱情,我是刑警寧澤怕吴,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布窍侧,位于F島的核電站,受9級特大地震影響转绷,放射性物質(zhì)發(fā)生泄漏伟件。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一议经、第九天 我趴在偏房一處隱蔽的房頂上張望斧账。 院中可真熱鬧,春花似錦煞肾、人聲如沸咧织。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽习绢。三九已至,卻和暖如春蝙昙,著一層夾襖步出監(jiān)牢的瞬間闪萄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工耸黑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桃煎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓大刊,卻偏偏與公主長得像为迈,于是被迫代替她去往敵國和親三椿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354