Calendar.GetWeekOfYear не работает для даты в Швеции [дубликат]

Вам нужно будет присвоить метке шрифт, поддерживающий арабский язык

#option1 -- on each TextInput
TextInput:
    font_name: "path/to/a/font/that/support/arabic.ttf"

#option2 override for all TextInputs
:
    font_name: ...

, предупреждение из docs говорит:

Warning В зависимости от вашего поставщика текста файл шрифтов может быть проигнорирован. Однако вы можете использовать это без проблем. Если в используемом шрифте отсутствуют глифы для определенного языка / символов, которые вы используете, вы увидите «[]» символы пустого поля, а не фактические глифы. Решение заключается в использовании шрифта, который имеет глифы, которые вам нужно отображать. Например, чтобы отобразить unicodechar, используйте шрифт, например freesans.ttf, который имеет глиф.

148
задан Stefano Altieri 13 March 2013 в 16:46
поделиться

11 ответов

Как отмечено на этой странице MSDN , существует небольшая разница между неделей ISO8601 и нулевой нумерацией .Net.

Вы можете обратиться к этой статье в блоге MSDN для лучшего объяснения : " Формат ISO 8601 Week of Year в Microsoft .Net "

Проще говоря, .Net позволяет разделить недели на несколько лет, в то время как стандарт ISO не работает. В этой статье также есть простая функция для получения правильного номера номера ISO 8601 за последнюю неделю года.

Обновление. Следующий метод действительно возвращает 1 для 2012-12-31, который является правильным в ISO 8601 ( например, в Германии).

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
} 
225
ответ дан Dzienny 3 September 2018 в 16:09
поделиться

Год имеет 52 недели и 1 день или 2 в течение года (52 x 7 = 364). 2012-12-31 будет неделя 53, неделя, которая будет иметь только 2 дня, потому что 2012 год круглый год.

-1
ответ дан CarlosJ 3 September 2018 в 16:09
поделиться

Это способ:

public int GetWeekNumber()
{
    CultureInfo ciCurr = CultureInfo.CurrentCulture;
    int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return weekNum;
}

Наиболее важным является параметр CalendarWeekRule.

См. здесь: https://msdn.microsoft.com /query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalendarWeekRule);k(TargetFrameworkMoniker-.NETFramework

10
ответ дан daniele3004 3 September 2018 в 16:09
поделиться
var cultureInfo = CultureInfo.CurrentCulture;
var calendar = cultureInfo.Calendar;

var calendarWeekRule = cultureInfo.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = cultureInfo.DateTimeFormat.FirstDayOfWeek;
var lastDayOfWeek = cultureInfo.LCID == 1033 //En-us
                    ? DayOfWeek.Saturday
                    : DayOfWeek.Sunday;

var lastDayOfYear = new DateTime(date.Year, 12, 31);

var weekNumber = calendar.GetWeekOfYear(date, calendarWeekRule, firstDayOfWeek);

 //Check if this is the last week in the year and it doesn`t occupy the whole week
return weekNumber == 53 && lastDayOfYear.DayOfWeek != lastDayOfWeek 
       ? 1  
       : weekNumber;

Он хорошо работает как для культур США, так и для России. ИСО 8601 также будет правильным, потому что русская неделя начинается в понедельник.

1
ответ дан Donskikh Andrei 3 September 2018 в 16:09
поделиться
  DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
  DateTime date1 = new DateTime(2011, 1, 1);
  Calendar cal = dfi.Calendar;

  Console.WriteLine("{0:d}: Week {1} ({2})", date1, 
                    cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
                                      dfi.FirstDayOfWeek),
                    cal.ToString().Substring(cal.ToString().LastIndexOf(".") + 1));      
0
ответ дан Imran 3 September 2018 в 16:09
поделиться

Вопрос: как вы определяете, есть ли неделя в 2012 году или в 2013 году? Ваше предположение, я думаю, состоит в том, что с 6 дней недели в 2013 году эта неделя должна быть отмечена как первая неделя 2013 года.

Не уверен, что это правильный путь. Эта неделя началась в 2012 году (понедельник 31 декабря), поэтому она должна быть отмечена как последняя неделя 2012 года, поэтому она должна быть 53-м 2012 года. Первая неделя 2013 года должна начаться в понедельник 7-м.

Теперь вы можете обработать конкретный случай крайних недель (первая и последняя неделя года) с использованием информации дня недели. Все зависит от вашей логики.

0
ответ дан James 3 September 2018 в 16:09
поделиться

Хорошие новости! Запрос pull добавление System.Globalization.ISOWeek в .NET Core просто слилось и в настоящее время запланировано для выпуска 3.0. Надеюсь, что он будет распространяться на другие платформы .NET в не слишком отдаленном будущем.

Тип имеет следующую подпись, которая должна охватывать большинство дней ISO :

namespace System.Globalization
{
    public static class ISOWeek
    {
        public static int GetWeekOfYear(DateTime date);
        public static int GetWeeksInYear(int year);
        public static int GetYear(DateTime date);
        public static DateTime GetYearEnd(int year);
        public static DateTime GetYearStart(int year);
        public static DateTime ToDateTime(int year, int week, DayOfWeek dayOfWeek);
    }
}

Здесь вы можете найти исходный код .

1
ответ дан khellang 3 September 2018 в 16:09
поделиться

В году может быть более 52 недель. Каждый год имеет 52 полных недели + 1 или +2 (високосный год) дополнительных дней. Они собираются на 53-й неделе.

  • 52 недели * 7 дней = 364 дня.

Итак, для каждого года у вас есть хотя бы один дополнительный день. Два для високосных лет. Эти дополнительные дни считаются отдельными неделями?

Сколько недель действительно зависит от начального дня вашей недели. Давайте рассмотрим это на 2012 год.

  • США (воскресенье -> суббота): 52 недели + одна короткая 2-дневная неделя на 2012-12-30 годы и amp; 2012-12-31. В результате это составляет 53 недели. Последние два дня этого года (воскресенье + понедельник) составляют свою короткую неделю.

Проверьте настройки текущей культуры, чтобы увидеть, что она использует в качестве первого дня недели.

Как вы видите, в результате получается нормально.

  • Европа (понедельник -> воскресенье): январь 2dn (2012-1-2) - первый понедельник, так что это это первый день первой недели. Спросите номер недели на 1 января, и вы вернетесь 52, так как это считается частью прошлой недели 2011 года.

Возможно даже иметь 54-ю неделю. Случается каждые 28 лет, когда 1 января и 31 декабря рассматриваются как отдельные недели. Это тоже должен быть високосный год.

Например, 2000 год имел 54 недели. 1 января (сидел) был первый недельный день, а 31 декабря (солнце) был вторым недельным днем.

var d = new DateTime(2012, 12, 31);
CultureInfo cul = CultureInfo.CurrentCulture;

var firstDayWeek = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int weekNum = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int year = weekNum == 52 && d.Month == 1 ? d.Year - 1 : d.Year;
Console.WriteLine("Year: {0} Week: {1}", year, weekNum);

Распечатывает: Год: 2012 Неделя: 54

Измените CalendarWeekRule в приведенном выше примере на FirstFullWeek или FirstFourDayWeek, и вы вернетесь назад 53. Давайте сохраним начальный день в понедельник, так как мы имеем дело с Германией.

Итак, неделя 53 начинается в понедельник 2012-12- 31, длится один день, а затем останавливается.

53 - правильный ответ. Измените культуру на германию, если хотите попробовать.

CultureInfo cul = CultureInfo.GetCultureInfo("de-DE");
25
ответ дан Prashant Yadav 3 September 2018 в 16:09
поделиться

C # в порт Powershell из кода выше из il_guru :

function GetWeekOfYear([datetime] $inputDate)
{
   $day = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetDayOfWeek($inputDate)
   if (($day -ge [System.DayOfWeek]::Monday) -and ($day -le [System.DayOfWeek]::Wednesday))
   {
      $inputDate = $inputDate.AddDays(3)
   }

   # Return the week of our adjusted day
   $weekofYear = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetWeekOfYear($inputDate, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [System.DayOfWeek]::Monday)
   return $weekofYear
}
3
ответ дан Rainer 3 September 2018 в 16:09
поделиться

Я собираюсь играть в Necromancer здесь: -)

Поскольку, похоже, не существует .Net-культуры, которая дает правильный номер недели ISO-8601, я бы стал обходить встроенное в неделю определение alltogether, и делать расчет вручную, вместо того, чтобы пытаться исправить частично правильный результат.

В результате я получил следующий метод расширения:

/// <summary>
/// Converts a date to a week number.
/// ISO 8601 week 1 is the week that contains the first Thursday that year.
/// </summary>
public static int ToIso8601Weeknumber(this DateTime date)
{
    var thursday = date.AddDays(3 - date.DayOfWeek.DayOffset());
    return (thursday.DayOfYear - 1) / 7 + 1;
}

/// <summary>
/// Converts a week number to a date.
/// Note: Week 1 of a year may start in the previous year.
/// ISO 8601 week 1 is the week that contains the first Thursday that year, so
/// if December 28 is a Monday, December 31 is a Thursday,
/// and week 1 starts January 4.
/// If December 28 is a later day in the week, week 1 starts earlier.
/// If December 28 is a Sunday, it is in the same week as Thursday January 1.
/// </summary>
public static DateTime FromIso8601Weeknumber(int weekNumber, int? year = null, DayOfWeek day = DayOfWeek.Monday)
{
    var dec28 = new DateTime((year ?? DateTime.Today.Year) - 1, 12, 28);
    var monday = dec28.AddDays(7 * weekNumber - dec28.DayOfWeek.DayOffset());
    return monday.AddDays(day.DayOffset());
}

/// <summary>
/// Iso8601 weeks start on Monday. This returns 0 for Monday.
/// </summary>
private static int DayOffset(this DayOfWeek weekDay)
{
    return ((int)weekDay + 6) % 7;
}

Прежде всего, ((int) date.DayOfWeek + 6)% 7) определяет день недели, 0 = понедельник, 6 = воскресенье.

date.AddDays (- ((int) date.DayOfWeek + 6)% 7) определяет дату понедельника, предварительно затребовав номер запрашиваемой недели.

Три дня спустя - это целевой день, который определяет, в каком году проходит неделя.

Если вы разделите день (число на ноль) в течение года на семь (округлить вниз), вы получите (нулевой) номер недели в году.

В c # результаты целочисленного вычисления округлены вниз неявно.

5
ответ дан realbart 3 September 2018 в 16:09
поделиться

Самый простой способ определить номер недели по ISO 8601 с использованием c # и класса DateTime.

Задайте этот вопрос: в течение многих часов в этом году наступит четвертый день этой недели. Ответ равен желаемому номеру недели.

var dayOfWeek = (int)moment.DayOfWeek;
// Make monday the first day of the week
if (--dayOfWeek < 0)
    dayOfWeek = 6;
// The whole nr of weeks before this thursday plus one is the week number
var weekNumber = (moment.AddDays(3 - dayOfWeek).DayOfYear - 1) / 7 + 1;
2
ответ дан user6887101 3 September 2018 в 16:09
поделиться
Другие вопросы по тегам:

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