Вам нужно будет присвоить метке шрифт, поддерживающий арабский язык
#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, который имеет глиф.
Как отмечено на этой странице 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);
}
Год имеет 52 недели и 1 день или 2 в течение года (52 x 7 = 364). 2012-12-31 будет неделя 53, неделя, которая будет иметь только 2 дня, потому что 2012 год круглый год.
Это способ:
public int GetWeekNumber()
{
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
}
Наиболее важным является параметр CalendarWeekRule
.
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 также будет правильным, потому что русская неделя начинается в понедельник.
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));
Вопрос: как вы определяете, есть ли неделя в 2012 году или в 2013 году? Ваше предположение, я думаю, состоит в том, что с 6 дней недели в 2013 году эта неделя должна быть отмечена как первая неделя 2013 года.
Не уверен, что это правильный путь. Эта неделя началась в 2012 году (понедельник 31 декабря), поэтому она должна быть отмечена как последняя неделя 2012 года, поэтому она должна быть 53-м 2012 года. Первая неделя 2013 года должна начаться в понедельник 7-м.
Теперь вы можете обработать конкретный случай крайних недель (первая и последняя неделя года) с использованием информации дня недели. Все зависит от вашей логики.
Хорошие новости! Запрос 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);
}
}
В году может быть более 52 недель. Каждый год имеет 52 полных недели + 1 или +2 (високосный год) дополнительных дней. Они собираются на 53-й неделе.
Итак, для каждого года у вас есть хотя бы один дополнительный день. Два для високосных лет. Эти дополнительные дни считаются отдельными неделями?
Сколько недель действительно зависит от начального дня вашей недели. Давайте рассмотрим это на 2012 год.
Проверьте настройки текущей культуры, чтобы увидеть, что она использует в качестве первого дня недели.
Как вы видите, в результате получается нормально.
Возможно даже иметь 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");
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
}
Я собираюсь играть в 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 # результаты целочисленного вычисления округлены вниз неявно.
Самый простой способ определить номер недели по 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;