Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从DateTime Dart对象获取一年中的日期、星期_Datetime_Dart - Fatal编程技术网

如何从DateTime Dart对象获取一年中的日期、星期

如何从DateTime Dart对象获取一年中的日期、星期,datetime,dart,Datetime,Dart,我需要从dart DateTime对象中获取一年中的哪一天(第1天是1月1日)、哪一周和哪一个月 我没有找到任何可用于此的库。有什么想法吗?一年中的某一天 final date = someDate; final diff = now.difference(new DateTime(date.year, 1, 1, 0, 0)); final diffInDays = diff.inDays; // This will return the day of year from now Jiffy

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

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

一年中的某一天

final date = someDate;
final diff = now.difference(new DateTime(date.year, 1, 1, 0, 0));
final diffInDays = diff.inDays;
// 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
一年中的一周

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;
}
Jiffy().week; // 43

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

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

注意:这不是经过战斗测试的代码。

这是我在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);
  }
}

[原始答案-请在下面滚动至更新的答案,其中包含更新的计算]

一年中的一周:

/// 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();
}
其余部分可通过(部分)获取

[最新答覆] 正如亨里克·柯克(Henrik Kirk)在评论中指出的那样,最初的答复没有包括对某些日期的必要更正。下面是ISO周日期计算的完整实现

/// Calculates number of weeks for a given year as per https://en.wikipedia.org/wiki/ISO_week_date#Weeks_per_year
int numOfWeeks(int year) {
  DateTime dec28 = DateTime(year, 12, 28);
  int dayOfDec28 = int.parse(DateFormat("D").format(dec28));
  return ((dayOfDec28 - dec28.weekday + 10) / 7).floor();
}

/// 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));
  int woy =  ((dayOfYear - date.weekday + 10) / 7).floor();
  if (woy < 1) {
    woy = numOfWeeks(date.year - 1);
  } else if (woy > numOfWeeks(date.year)) {
    woy = 1;
  }
  return woy;
}
///根据以下公式计算给定年份的周数:https://en.wikipedia.org/wiki/ISO_week_date#Weeks_per_year
整数周(整数年){
DateTime dec28=日期时间(年,12,28);
int dayOfDec28=int.parse(DateFormat(“D”).format(dec28));
返回((dayOfDec28-dec28.weekday+10)/7);
}
///根据从日期计算周数https://en.wikipedia.org/wiki/ISO_week_date#Calculation
国际周编号(日期时间日期){
int dayOfYear=int.parse(DateFormat(“D”).format(date));
intwoy=((dayOfYear-date.weekday+10)/7.floor();
if(woy<1){
woy=周数(date.year-1);
}否则,如果(woy>NUMOF周(日期年)){
woy=1;
}
返回woy;
}

我根据您的答案编写了另一个解决方案,看起来效果不错,但如果您发现问题,请随时给我反馈:

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));
  }
}
class-DateUtils{
静态int currentWeek(){
返回weekOfYear(DateTime.now());
}
静态整数年(日期时间日期){
DateTime monday=周开始(日期);
DateTime first=weekYearStartDate(年的星期一);
int week=1+(星期一.差(第一).inDays/7).floor();
如果(周==53&&DateTime(年12月31日,星期一)。工作日<4)
周=1;
返回周;
}
静态日期时间周开始(日期时间日期){
//这很难看,但要避免日光节约的问题
DateTime monday=DateTime.utc(date.year、date.month、date.day);
星期一=星期一.subtract(持续时间(天:星期一.weekday-1));
星期一返回;
}
静态日期时间周末(日期时间日期){
//这很难看,但要避免日光节约的问题
//将最后一微秒设置为本周结束
DateTime sunday=DateTime.utc(date.year,date.month,date.day,23,59,599999999);
星期天=星期天。添加(持续时间(天:7-星期天。工作日));
周日返回;
}
静态日期时间weekYearStartDate(整年){
年的最后一天=DateTime.utc(年,1,1);
周末的最后一天=一年的第一天。工作日;

return firstDayOfYear.add(Duration(days)(days:(dayOfWeek试试这个非常简单的dart包,。下面的代码会有所帮助

获取一年中的某一天的日期

final date = someDate;
final diff = now.difference(new DateTime(date.year, 1, 1, 0, 0));
final diffInDays = diff.inDays;
// 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
获得一年中的一周

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;
}
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
希望这个答案有助于

根据ISO 8601进行每周编号
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
}

参考(官方)>


测试和工作您不需要任何软件包

此计算适合我

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];
}
int dayOfWeek({DateTime date}){
如果(日期==null)
date=DateTime.now();
intw=((dayOfYear(date)-date.weekday+10)/7.floor();
如果(w==0){
w=getYearsWeekCount(日期:第1年);
}否则如果(w==53){
DateTime lastDay=DateTime(date.year,DateTime.december,31);
如果(lastDay.weekday
如果年份发生变化,则先前投票最多的解决方案不起作用。例如,2020年12月为53周,如果我改为2021年1月,则先前的解决方案计算为0,而不是53周

所以我写了一个日期时间扩展来覆盖年份的变化

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

如果他认为YYYY-01-01是“第1天”,那么您需要在差异中添加1,否则它将关闭。此外,由于日期差异基于小时数,在使用本地时间时,可能会由于DST而出现一些问题。本地时间是一个很好的提示。感谢@Herohtar。使用
someDate().toUtc()
应该避免此类问题。我认为对于2019-12-31这样的日期,您的“一年中的一周”功能不正确,而2019-12-31实际上是2020年的第一个日历周(在ISO 8601中)。我将我的实现粘贴在下面,在这些边缘情况下,“一年中的一天”可以工作函数返回不正确的结果!转换为UTC没有帮助。这是一个很好的答案!这是一个很好的答案。必须将
intl:^0.15.7
作为依赖项导入
pubspec.yaml
这只是计算的一半,如果结果为0,您应该得到上一年的最后一周。请参阅上面链接中的公式。注意:这将失败在某些语言中。例如,波斯语的值不能被解析为整数。@HenrikKirk绝对正确,我错过了。迟做总比不做要好。我更正了答案。谢谢你的答案。它很有效。我为你缺少的函数添加了一些代码
isbeforequal()
addDays()
if(date.isAfter)(nextWeekYearStartDate)| Utils.isSameDay(date,nextWeekYearStartDate)){return date.year+1;}
if(dayOfWeek)我认为这应该是公认的答案。这是唯一的一个gi