从Flutter中的DateTime类获取意外日期

时间:2019-08-01 13:41:11

标签: flutter dart

我正在尝试将日期和时间的字符串合并为DateTime格式,以便可以使用两个时间戳的区别。

但是,当将日期作为“ 2019年7月31日”和时间作为“ 5:07 PM”(采用正确的格式,如在toDateTimeFormat方法中看到的)传递给DateTime构造函数时,它给了我意外的日期,即2019- 07-01 17:07:00.000,预计日期应为2019-07-31 17:07:00.000

我也尝试过使用DateTime.utc构造函数,但没有成功,下面是我的代码

import 'package:intl/intl.dart';

void main(){

  String dateOne = "31-July-2019";
  String timeOne = "5:07PM";

  String dateTwo = "01-Aug-2019";
  String timeTwo = "12:00AM";

  DateTime reminderDate = toDateTimeFormat(dateOne,timeOne);
  // 2019-07-01 17:07:00.000  which is wrong...,  EXPECTED --> 2019-07-31 17:07:00.000

  DateTime dueDate = toDateTimeFormat(dateTwo, timeTwo);

  bool value = isValidReminderDate(reminderDate, dueDate);
  // REMINDER DATE < DUE DATE SO RETURN TRUE ELSE FALSE...., EXPECTED --> TRUE
  print(value);
}

var monthsNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"];

DateTime toDateTimeFormat(String date, String time){
  if(date != null && time != null){
    //date: 01-jan-2000 and time: "6:45PM"

    List<String> _parts = date.split("-");
    List<String> _timeParts =[];

      var dt = DateFormat("h:mma").parse(time);
      _timeParts = DateFormat('HH:mm').format(dt).split(":");

    DateTime dateTime =  DateTime(int.parse(_parts[2]),monthsNames.indexOf(_parts[1]),int.parse(_parts[0]), int.parse(_timeParts[0]), int.parse(_timeParts[1]) ,);

    // ALSO TRIED WITH DateTime.utc(int.parse(_parts[2]),monthsNames.indexOf(_parts[1]),int.parse(_parts[0]), int.parse(_timeParts[0]), int.parse(_timeParts[1]) ,);
    // but of no use...

    print("dateTime :: $dateTime");
    return dateTime;
  }
}

bool isValidReminderDate(DateTime reminderDate, DateTime dueDate){
  print('isValidReminderDate :: ${reminderDate.difference(dueDate).isNegative}');
  return reminderDate.difference(dueDate).isNegative;
}

1 个答案:

答案 0 :(得分:1)

您应该能够直接使用<metro:MetroWindow x:Class="PrismKnxPmpApp.Views.Shell" xmlns:metro="http://metro.mahapps.com/winfx/xaml/controls" > <Grid x:Name="LayoutRoot" > <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="30"/> </Grid.RowDefinitions> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <ToolBarTray DockPanel.Dock="Left" IsLocked="True" Orientation="Vertical" Style="{StaticResource MainToolBarTrayStyle}"> <ToolBar x:Name="NavigationItemsControl" prism:RegionManager.RegionName="MainNavigationRegion" Style="{StaticResource MainToolBarStyle}" > </ToolBar> </ToolBarTray> <ContentControl prism:RegionManager.RegionName="MainContentRegion" Grid.Column="1" Grid.Row="2" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/> </Grid> </Grid> </metro:MetroWindow> 解析这些字符串(下面有一个警告)。

package:intl

打印 var dateOne = "31-Jul-2019"; var timeOne = "5:07PM"; var dateTwo = "01-Aug-2019"; var timeTwo = "12:00AM"; var format = DateFormat("dd'-'MMM'-'yyyy hh:mma"); var one = format.parse('$dateOne $timeOne'); var two = format.parse('$dateTwo $timeTwo'); print('$one $two ${two.difference(one)}');

需要注意的是,由于您在其他地方使用了3个字母的缩写,因此您必须使用2019-07-31 17:07:00.000 2019-08-01 00:00:00.000 6:53:00.000000而不是JulJuly而不是Sep