How to get day of year, week of year from a DateTi

2019-02-23 16:50发布

问题:

I need to get day of year (day1 is 1rst of january), week of year, and month of year from a dart DateTime object.

I did not find any available library for this. Any idea ?

回答1:

Day of year

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

Week of year

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;
}

Month of year

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

Caution: That's not battle-tested code.



回答2:

This is my implementation of ISO 8601 Week of Year in Dart:

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);
  }
}

Note that the "week year" is not always the calendar year, it could also be the one before or after:

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


回答3:

Week of year:

/// 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();
}

The rest is available through DateFormat (part of the intl package).



标签: datetime dart