如何从DateTime Dart对象获取一年中的某一天,一年中的一周

时间:2018-03-20 20:06:35

标签: datetime dart

我需要从dart DateTime对象获取一年中的一天(第1天是1月1日),一年中的一周和一年中的一个月。

我没有为此找到任何可用的库。有什么想法吗?

10 个答案:

答案 0 :(得分:7)

一年中的一天

final date = someDate;
final diff = now.difference(new DateTime(date.year, 1, 1, 0, 0));
final diffInDays = diff.inDays;

一年中的一周

final date = someDate;
final startOfYear = new DateTime(date.year, 1, 1, 0, 0);
final firstMonday = startOfYear.weekday;
final daysInFirstWeek = 8 - firstMonday;
final diff = date.difference(startOfYear);
var weeks = ((diff.inDays - daysInFirstWeek) / 7).ceil();
// It might differ how you want to treat the first week
if(daysInFirstWeek > 3) {
  weeks += 1;
}

一年中的一个月

final monthOfYear = new DateTime.now().month;

警告:这不是经过实战考验的代码。

答案 1 :(得分:4)

数字周符合ISO 8601

int isoWeekNumber(DateTime date) {
    int daysToAdd = DateTime.thursday - date.weekday;
    DateTime thursdayDate = daysToAdd > 0 ? date.add(Duration(days: daysToAdd)) : date.subtract(Duration(days: daysToAdd.abs()));
    int dayOfYearThursday = dayOfYear(thursdayDate);
    return 1 + ((dayOfYearThursday - 1) / 7).floor();
}
int dayOfYear(DateTime date) {
    return date.difference(DateTime(date.year, 1, 1)).inDays;
}

答案 2 :(得分:3)

一年中的一周

/// Calculates week number from a date as per https://en.wikipedia.org/wiki/ISO_week_date#Calculation
int weekNumber(DateTime date) {
  int dayOfYear = int.parse(DateFormat("D").format(date));
  return ((dayOfYear - date.weekday + 10) / 7).floor();
}

其余的可通过DateFormatintl package的一部分)获得。

答案 3 :(得分:3)

尝试使用这种非常简单的飞镖包Jiffy。下面的代码会有所帮助

获取日期为一年中的某天

// This will return the day of year from now
Jiffy().dayOfYear; // 295

// You can also pass in a dateTime object
Jiffy(DateTime(2019, 1, 3)).dayOfYear; // 3

获取一年中的一周

Jiffy().week; // 43

// You can also pass in an Array or Map
Jiffy([2019, 1, 3]).week; // 1

获取一年中的月份

Jiffy().month; // 10

Jiffy({
    "year": 2019,
    "month": 1,
    "day": 3
  }).month; // 1

希望这个答案有帮助

答案 4 :(得分:2)

这是我在Dart中实施的ISO 8601年度周:

int getWeekOfYear(DateTime date) {
  final weekYearStartDate = getWeekYearStartDateForDate(date);
  final dayDiff = date.difference(weekYearStartDate).inDays;
  return ((dayDiff + 1) / 7).ceil();
}

DateTime getWeekYearStartDateForDate(DateTime date) {
  int weekYear = getWeekYear(date);
  return getWeekYearStartDate(weekYear);
}

int getWeekYear(DateTime date) {
  assert(date.isUtc);

  final weekYearStartDate = getWeekYearStartDate(date.year);

  // in previous week year?
  if(weekYearStartDate.isAfter(date)) {
    return date.year - 1;
  }

  // in next week year?
  final nextWeekYearStartDate = getWeekYearStartDate(date.year + 1);
  if(isBeforeOrEqual(nextWeekYearStartDate, date)) {
    return date.year + 1;
  }

  return date.year;
}

DateTime getWeekYearStartDate(int year) {
  final firstDayOfYear = DateTime.utc(year, 1, 1);
  final dayOfWeek = firstDayOfYear.weekday;
  if(dayOfWeek <= DateTime.thursday) {
    return addDays(firstDayOfYear, 1 - dayOfWeek);
  }
  else {
    return addDays(firstDayOfYear, 8 - dayOfWeek);
  }
}

请注意,“周年”并不总是日历年,也可以是之前或之后的一年:

void printWeekOfYear(DateTime date) {
  print('week ${getWeekOfYear(date)} in year ${getWeekYear(date)}');
}

printWeekOfYear(DateTime.utc(2017, 1, 1));
// --> week 52 in year 2016

printWeekOfYear(DateTime.utc(2019, 12, 31));
// --> week 1 in year 2020

答案 5 :(得分:2)

Dart SDK2.8.4及更高版本:
一年中的某天,不带包:

void main(){
  final now = new DateTime.now();
  final todayInDays = now.difference(new DateTime(now.year,1,1,0,0)).inDays; //return 157
}


参考(官方)> inDays, from Dart Official documentation

答案 6 :(得分:1)

我根据您的回答写了另一种解决方案,它似乎很好用,但是如果发现问题,请随时给我反馈:

class DateUtils {

  static int currentWeek() {
    return weekOfYear(DateTime.now());
  }

  static int weekOfYear(DateTime date) {
    DateTime monday = weekStart(date);
    DateTime first = weekYearStartDate(monday.year);

    int week = 1 + (monday.difference(first).inDays / 7).floor();

    if (week == 53 && DateTime(monday.year, 12, 31).weekday < 4)
      week = 1;

    return week;
  }

  static DateTime weekStart(DateTime date) {
    // This is ugly, but to avoid problems with daylight saving
    DateTime monday = DateTime.utc(date.year, date.month, date.day);
    monday = monday.subtract(Duration(days: monday.weekday - 1));

    return monday;
  }

  static DateTime weekEnd(DateTime date) {
    // This is ugly, but to avoid problems with daylight saving
    // Set the last microsecond to really be the end of the week
    DateTime sunday = DateTime.utc(date.year, date.month, date.day, 23, 59, 59, 999, 999999);
    sunday = sunday.add(Duration(days: 7 - sunday.weekday));

    return sunday;
  }

  static DateTime weekYearStartDate(int year) {
    final firstDayOfYear = DateTime.utc(year, 1, 1);
    final dayOfWeek = firstDayOfYear.weekday;

    return firstDayOfYear.add(Duration(days: (dayOfWeek <= DateTime.thursday ? 1 : 8) - dayOfWeek));
  }
}

答案 7 :(得分:0)

getWeekOfYear(){
    DateTime _kita=DateTime.now();
    int d=DateTime.parse("${_kita.year}-01-01").millisecondsSinceEpoch;
    int t= _kita.millisecondsSinceEpoch;
    double daydiff= (t- d)/(1000 * (3600 * 24));
    double week= daydiff/7;
    return(week.ceil());
}

经过测试,可以正常工作,不需要任何包装

答案 8 :(得分:0)

此计算对我有用。

int dayOfWeek({DateTime date}) {
  if (date == null)
    date = DateTime.now();

  int w = ((dayOfYear(date) - date.weekday + 10) / 7).floor();

  if (w == 0) {
    w = getYearsWeekCount(date.year-1);
  } else if (w == 53) {
    DateTime lastDay = DateTime(date.year, DateTime.december, 31);
    if (lastDay.weekday < DateTime.thursday) {
      w = 1;
    }
  }
  return w;
}

int getYearsWeekCount(int year) {
  DateTime lastDay = DateTime(year, DateTime.december, 31);
  int count = dayOfWeek(date: lastDay);
  if (count == 1)
    count = dayOfWeek(date: lastDay.subtract(Duration(days: 7)));
  return count;
}

int dayOfYear(DateTime date) {
  int total = 0;
  for (int i = 1; i < date.month; i++) {
    total += getDayOfMonth(date.year, i);
  }
  total+=date.day;
  return total;
}

int getDayOfMonth(int year, int month) {
  final List<int> days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  if (year % 4 == 0) days[DateTime.february]++;
  return days[month];
}

答案 9 :(得分:0)

如果年份更改,先前投票最多的解决方案将不起作用。例如2020年12月为53周,如果我更改为2021年1月,则先前的解决方案将计算为0,而不是53。

所以我写了一个DateTime扩展名来涵盖年份变化。

  int get weekNumber {
    if (weekday > DateTime.thursday) {
      int toSubstract = weekday - DateTime.thursday;
      DateTime thursday = subtract(Duration(days: toSubstract));

      if (thursday.year != year) {
        return thursday.weekNumber;
      }
    }

    int dayOfYear = int.parse(format('D'));
    return ((dayOfYear - weekday + 10) / 7).floor();
  }