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

fvi*_*cot 10 datetime dart

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

我没有找到任何可用的库.任何的想法 ?

Gün*_*uer 8

一年中的一天

final date = someDate;
final diff = now.difference(new DateTime(date.year, 1, 1, 0, 0));
final diffInDays = diff.inDays;
Run Code Online (Sandbox Code Playgroud)

一周的一周

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;
}
Run Code Online (Sandbox Code Playgroud)

一年中的一个月

final monthOfYear = new DateTime.now().month;
Run Code Online (Sandbox Code Playgroud)

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

  • 此外,由于日期差异基于小时数,因此在使用本地时间时可能会因夏令时而出现一些问题。 (2认同)
  • 我认为对于 2019 年 12 月 31 日这样的日期,您的一年中的一周功能不正确,这实际上是 2020 年的第一个日历周(在 ISO 8601 中)。我在下面粘贴了我的实现,它适用于这些边缘情况 (2认同)

And*_*ázi 8

一年中的第几周:

/// 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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这只是计算的一半,如果结果为 0,您应该得到上一年的最后一周。请参阅上面链接中的公式。 (3认同)
  • 这是一个很好的答案! (2认同)
  • 这是一个很好的答案。必须导入 `intl: ^0.15.7` 作为 `pubspec.yaml` 中的依赖项 (2认同)

Jam*_*med 8

试试这个非常简单的 dart 包,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
Run Code Online (Sandbox Code Playgroud)

获得一年中的一周

Jiffy().week; // 43

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

获得一年中的月份

Jiffy().month; // 10

Jiffy({
    "year": 2019,
    "month": 1,
    "day": 3
  }).month; // 1
Run Code Online (Sandbox Code Playgroud)

希望这个答案有帮助


小智 8

根据 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;
}
Run Code Online (Sandbox Code Playgroud)


bof*_*mer 5

这是我在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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Art*_*nig 5

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
}
Run Code Online (Sandbox Code Playgroud)


参考(官方)> inDays,来自 Dart 官方文档