C# - Что лучший способ состоит в том, чтобы получить список недель через месяц, учитывая стартовый рабочий день?

Предполагая, var friend = { firstName: 'Harry', lastName: 'Potter' };

Есть два варианта:

Обновление модели в памяти и сохранение (простой javascript array.push):

person.friends.push(friend);
person.save(done);

или

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done
);

Я всегда стараюсь и выбираю первый вариант, когда это возможно, потому что он будет уважать больше преимуществ, которые дает вам мангуст (крючки, проверка и т. д.), ,

Однако, если вы делаете много одновременных записей, вы столкнетесь с условиями гонки, в результате чего вы столкнетесь с неприятными ошибками версий, чтобы остановить вас от замены всей модели каждый раз и потерять предыдущего добавленного вами друга , Так что только переходите к последнему, когда это абсолютно необходимо.

18
задан Daniel Schaffer 2 February 2009 в 22:13
поделиться

9 ответов

 // Get the weeks in a month

 DateTime date = DateTime.Today;
 // first generate all dates in the month of 'date'
 var dates = Enumerable.Range(1, DateTime.DaysInMonth(date.Year, date.Month)).Select(n => new DateTime(date.Year, date.Month, n));
 // then filter the only the start of weeks
 var weekends = from d in dates
                where d.DayOfWeek == DayOfWeek.Monday
                select d;
25
ответ дан 30 November 2019 в 07:09
поделиться
public static List<DateTime> GetWeeks(
    this DateTime month, DayOfWeek startOfWeek)
{
    var firstOfMonth = new DateTime(month.Year, month.Month, 1);
    var daysToAdd = ((Int32)startOfWeek - (Int32)month.DayOfWeek) % 7;
    var firstStartOfWeek = firstOfMonth.AddDays(daysToAdd);

    var current = firstStartOfWeek;
    var weeks = new List<DateTime>();
    while (current.Month == month.Month)
    {
        weeks.Add(current);
        current = current.AddDays(7);
    }

    return weeks;
}
10
ответ дан 30 November 2019 в 07:09
поделиться
int year = 2009;
int month = 2;
DateTime startDate = new DateTime(year, month, 1);
DateTime endDate = startDate.AddMonths(1);
while (startDate.DayOfWeek != DayOfWeek.Monday)
    startDate = startDate.AddDays(1);
for (DateTime result = startDate; result < endDate; result = result.AddDays(7))
    DoWhatYouWant(result);
1
ответ дан 30 November 2019 в 07:09
поделиться

Вот является решение (эффективно одна строка) использованием C# 3.0/LINQ, в случае, если Вам интересно:

var month = new DateTime(2009, 2, 1);
var weeks = Enumerable.Range(0, 4).Select(n => month.AddDays(n * 7 - (int)month.DayOfWeek + 1)).TakeWhile(monday => monday.Month == month.Month);
3
ответ дан 30 November 2019 в 07:09
поделиться

Как насчет этого?

  public IEnumerable<DateTime> GetWeeks(DateTime date, DayOfWeek startDay)
  {
     var list = new List<DateTime>();
     DateTime first = new DateTime(date.Year, date.Month, 1);

     for (var i = first; i < first.AddMonths(1); i = i.AddDays(1))
     {
        if (i.DayOfWeek == startDay)
           list.Add(i);
     }

     return list;
  }
1
ответ дан 30 November 2019 в 07:09
поделиться

Что-то как следующий псевдокод должно работать:

  • Определяют дату начала месяца (используйте месяц и год с даты и установите день на 1
  • , Решают, что дата окончания месяца (дата начала + 1 месяц)
  • Определяет первое свидание, которое является понедельником (это - Ваш первый объект в списке)
  • , Добавляют 7 дней для нахождения следующей даты и повторения, пока Вы не читаете или передаете конец месяца
0
ответ дан 30 November 2019 в 07:09
поделиться

Просто измените строку ответа на то, что когда-либо необходимо сделать с нею

protected void PrintDay(int year, int month, DayOfWeek dayName)
{
  CultureInfo ci = new CultureInfo("en-US");
  for (int i = 1 ; i <= ci.Calendar.GetDaysInMonth (year, month); i++)
  {
    if (new DateTime (year, month, i).DayOfWeek == dayName)
      Response.Write (i.ToString() + "<br/>");
  }
}

Быстрое решение: я не думаю, что существует созданный в функции для него....

0
ответ дан 30 November 2019 в 07:09
поделиться

Я вижу, что вы получили свой ответ, но я хотел поделиться с вами вспомогательным классом, который я создал для одного из моих проектов. Это далеко не всеобъемлющий класс, но может помочь ...

public static class WeekHelper {

#region Public Methods
public static DateTime GetWeekStart(DateTime date) {
    DateTime weekStart;
    int monday = 1;
    int crtDay = (int)date.DayOfWeek;
    if (date.DayOfWeek == DayOfWeek.Sunday)
        crtDay = 7;
    int difference = crtDay - monday;
    weekStart = date.AddDays(-difference);
    return weekStart;
}
public static DateTime GetWeekStop(DateTime date) {
    DateTime weekStart;
    int sunday = 7;
    int crtDay = (int)date.DayOfWeek;
    if (date.DayOfWeek == DayOfWeek.Sunday)
        crtDay = 7;
    int difference = sunday - crtDay;
    weekStart = date.AddDays(difference);
    return weekStart;
}
public static void GetWeekInterval(int year, int weekNo,
    out DateTime weekStart, out DateTime weekStop) {
    GetFirstWeekOfYear(year, out weekStart, out weekStop);
    if (weekNo == 1)
        return;
    weekNo--;
    int daysToAdd = weekNo * 7;
    DateTime dt = weekStart.AddDays(daysToAdd);
    GetWeekInterval(dt, out weekStart, out weekStop);
}
public static List<KeyValuePair<DateTime, DateTime>> GetWeekSeries(DateTime toDate) {
    //gets week series from beginning of the year
    DateTime dtStartYear = new DateTime(toDate.Year, 1, 1);
    List<KeyValuePair<DateTime, DateTime>> list = GetWeekSeries(dtStartYear, toDate);
    if (list.Count > 0) {
        KeyValuePair<DateTime, DateTime> week = list[0];
        list[0] = new KeyValuePair<DateTime, DateTime>(dtStartYear, week.Value);
    }
    return list;
}
public static List<KeyValuePair<DateTime, DateTime>> GetWeekSeries(DateTime fromDate, DateTime toDate) {
    if (fromDate > toDate)
        return null;
    List<KeyValuePair<DateTime, DateTime>> list = new List<KeyValuePair<DateTime, DateTime>>(100);
    DateTime weekStart, weekStop;
    toDate = GetWeekStop(toDate);
    while (fromDate <= toDate) {
        GetWeekInterval(fromDate, out weekStart, out weekStop);
        list.Add(new KeyValuePair<DateTime, DateTime>(weekStart, weekStop));
        fromDate = fromDate.AddDays(7);
    }
    return list;
}
public static void GetFirstWeekOfYear(int year, out DateTime weekStart, out DateTime weekStop) {
    DateTime date = new DateTime(year, 1, 1);
    GetWeekInterval(date, out weekStart, out weekStop);
}
public static void GetWeekInterval(DateTime date,
    out DateTime dtWeekStart, out DateTime dtWeekStop) {
    dtWeekStart = GetWeekStart(date);
    dtWeekStop = GetWeekStop(date);
}
#endregion Public Methods

}

0
ответ дан 30 November 2019 в 07:09
поделиться

Это прекрасно работает! Все, что вам нужно сделать, это указать первый день месяца, для которого вы хотите получить недели, а затем это даст вам первый день каждой недели. Вам нужно получить 5 недель (а не 4), поэтому Enumerable.Range отсчитывает 5 вместо 4.

var date = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
var weeks = from n in Enumerable.Range(0, 5)
   select date.AddDays(7 * n + (-1 * (int)date.DayOfWeek));
0
ответ дан 30 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: