【问题标题】:Flutter : Convert Integer To MonthFlutter:将整数转换为月份
【发布时间】:2020-07-07 22:51:21
【问题描述】:

我有模型和虚拟数据要这样测试:

型号


class TestingLoopingModel {
  String id;
  int month;
  int year;
  int value;

  TestingLoopingModel({
    this.id,
    this.month,
    this.year,
    this.value,
  });
}

虚拟数据


List<TestingLoopingModel> listTest = [
  //TODO Month 12 And 10 is not exist
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 2,
    year: 2020,
    value: 2000,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 4,
    year: 2020,
    value: 1500,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 6,
    year: 2020,
    value: 3000,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 8,
    year: 2020,
    value: 3500,
  ),

  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 1,
    year: 2020,
    value: 5000,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 3,
    year: 2020,
    value: 4500,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 5,
    year: 2020,
    value: 2111,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 7,
    year: 2020,
    value: 5555,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 9,
    year: 2020,
    value: 333,
  ),
  TestingLoopingModel(
    id: DateTime.now().toString(),
    month: 11,
    year: 2020,
    value: 2222,
  ),
];

我希望我的 listTest 中的 月份 转换为月份名称,例如 January,Feburary,March,April,Mei,etc...。我怎样才能做到这一点 ?

我知道我可以像这样使用Intl Packages DateFormat.MMMM().format(???); 但格式需要 DateTime 并且在我的列表中 Month 是整数。

谢谢

查看

SizedBox(
              height: sizes.height(context) / 1.7,
              child: ListView.separated(
                separatorBuilder: (ctx, index) => Divider(),
                itemCount: 12,
                shrinkWrap: true,
                itemBuilder: (BuildContext context, int index) {
                  final indexOrder = index + 1;

                  final result = listTest[index];
                  listTest.sort((a, b) => a.month.compareTo(b.month));
                  return InkWell(
                    onTap: () => showDialog(
                      context: context,
                      builder: (ctxDialog) => FormElectricTenant(),
                    ),
                    child: Padding(
                      padding: const EdgeInsets.symmetric(vertical: 8.0),
                      child: Row(
                        children: <Widget>[
                          titleHeaderRow(title: '$indexOrder' ?? '0'),
                          titleHeaderRow(title: '${result.month}' ?? '0'),
                          titleHeaderRow(title: '${result.value}' ?? '0'),
                        ],
                      ),
                    ),
                  );
                },
              ),
            ),

【问题讨论】:

  • 您是否尝试创建一个新的DateTime 对象并更改其月份?

标签: flutter dart


【解决方案1】:

DateFormat.MMMM().format(date)

简单且允许未来本地化。你可以把你的语言环境放在.MMMM() 里面。这是最好的和最具可扩展性的解决方案。

【讨论】:

    【解决方案2】:

    这是你想要的吗?

    将 month 替换为您的月份 int 值

    DateFormat('MMMM').format(DateTime(0, month))

    值:1 月、2 月 ...

    【讨论】:

    • 这太棒了。谢谢。另外,如果有人想要“Jan”、“Feb”等缩写格式,您可以输入三个 Ms,例如 DateFormat('MMM').format(DateTime(0, month))
    【解决方案3】:
    const Map<int,String> monthsInYear = {
     1: "January",
     2: "February",
     3: "March",
     4: “April”,
     5: “May”,
     6: “June”
     …
     12: "December"
    }
    

    在您的列表视图中

    ListView.separated(
            separatorBuilder: (ctx, index) => Divider(),
            itemCount: 12,
            shrinkWrap: true,
            itemBuilder: (BuildContext context, int index) {
              final indexOrder = index + 1;
    
              final result = listTest[index];
              listTest.sort((a, b) => a.month.compareTo(b.month));
              return InkWell(
                onTap: () => showDialog(
                  context: context,
                  builder: (ctxDialog) => FormElectricTenant(),
                ),
                child: Padding(
                  padding: const EdgeInsets.symmetric(vertical: 8.0),
                  child: Row(
                    children: <Widget>[
                      titleHeaderRow(title: '$indexOrder' ?? '0'),
                      titleHeaderRow(title: '${monthsInYear[result.month]}' ?? '---'),
                      titleHeaderRow(title: '${result.value}' ?? '0'),
                    ],
                  ),
                ),
              );
            },
          );
    

    【讨论】:

      【解决方案4】:

      好的,我明白了,就像 Gaurav Mall 所说,我创建了一个新的 DateTime 对象并像这样更改它

                        final indexOrder = index + 1;
                        final now = DateTime.now();
                        final result = listTest[index];
                        final month = DateTime(now.year, indexOrder, now.day);
                        final convertMonth =         DateFormat.MMMM(appConfig.indonesiaLocale).format(month);
                        print(convertMonth);
      

      查看

      SizedBox(
                    height: sizes.height(context) / 1.7,
                    child: ListView.separated(
                      separatorBuilder: (ctx, index) => Divider(),
                      itemCount: 12,
                      shrinkWrap: true,
                      itemBuilder: (BuildContext context, int index) {
                        final indexOrder = index + 1;
                        final now = DateTime.now();
                        final result = listTest[index];
                        final month = DateTime(now.year, indexOrder, now.day);
                        final convertMonth =
                            DateFormat.MMMM(appConfig.indonesiaLocale).format(month);
                        print(convertMonth);
                        listTest.sort((a, b) => a.month.compareTo(b.month));
                        return InkWell(
                          onTap: () => showDialog(
                            context: context,
                            builder: (ctxDialog) => FormElectricTenant(),
                          ),
                          child: Padding(
                            padding: const EdgeInsets.symmetric(vertical: 8.0),
                            child: Row(
                              children: <Widget>[
                                titleHeaderRow(title: '$indexOrder' ?? '0'),
                                titleHeaderRow(title: '$convertMonth' ?? '0'),
                                titleHeaderRow(title: '${result.value}' ?? '0'),
                              ],
                            ),
                          ),
                        );
                      },
                    ),
                  ),
      

      【讨论】:

      • 或者你可以走简单的路,使用 const 月 = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun ', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', ]; 和类似 print(months[0]) (或 print(months[model.month - 1]) 在你的情况下)来显示它的名字。
      • 就我而言,我数据库中的月份是整数,例如 1,2,3,4,5 不像你说的那样。所以我应该将它从整数转换为月份名称
      • 你不需要转换任何东西。列表从索引 0 开始,所以 0 - 是一月,1 - 二月,依此类推。例如 - 您只需使用 months(0) 来获取 Jan。
      猜你喜欢
      • 2021-03-03
      • 1970-01-01
      • 2013-03-08
      • 2023-03-13
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多