2014-01-14 3 views
1

это, вероятно, очень уникальный вопрос, потому что я искал в Google какое-то время & не смог найти решение. Это также интересно.Получить имя дня по номеру

Что мне нужно в bascailly - это число, которое вы можете получить от имени дня.

Например, нашему номеру 7, нам нужно пройти через формулу, чтобы узнать ее название дня, но для 7 это базовая, все, что вы делаете, это просто получить «субботу» в инструкции switch.

В основном это просто, чтобы получить имя, вы только что сделали:

switch (dayNumber) { 
    case 1: return "Sunday"; etc... 

Но мой вопрос довольно сложно, я думаю, и я не уверен, что если логически есть возможное решение для него.

Я хочу получить индексный номер недели по числу.

примеры:

  • день 7 - Индекс: 7
  • день 16 - Индекс: 2 (потому что вы рассчитывать первые 2 недели 7 + 7 = 14, а затем + 2 = 16, так что день . понедельник
  • день 24 - индекс: 3

Зачем мне это нужно:

Ну у меня был вопрос в последнее время в Java, конечно, не отн но это связано с циклом в течение месяца, поэтому я хотел быть творческим & даже получить название конкретного дня, быстро используя математические функции и формулы.

Так пример того, как я хочу, чтобы получить имя:

for (int i = 1; i <= 31; i++) { 
    System.out.println(getDayByInteger(i)); 
} 

public static String getDayByInteger(int day) { 
     int dayNumber = 0; //TODO Formula.. 
     switch (dayNumber) { 
      case 1: 
       return "Sunday"; 
      case 2: 
       return "Monday"; 
      case 3: 
       return "Tuesday"; 
      case 4: 
       return "Wednesday"; 
      case 5: 
       return "Thursday"; 
      case 6: 
       return "Friday"; 
      case 7: 
       return "Saturday"; 
      default: return "N/A"; 
     } 
    } 

Я не возражаю, если он только будет поддерживать диапазон номеров 1-31, но мой вопрос сосредотачивается на, если это возможно, чтобы сделать это работайте с любым числом, потому что вы всегда можете построить формулу для работы в определенном диапазоне чисел, я думаю.

Возможно ли это для любого номера? Или это потребует проверки заявлений?

+0

Трудно представить свой вопрос, но вы, похоже, ищете оставшегося '' 'оператора. – devnull

+1

На самом деле не совсем понятно, что должно означать входной номер. Похоже, вы могли бы уйти просто с 'day% 7' (а затем индексировать в массив, а не использовать switch/case), но ваши требования не ясны. –

+0

см. Http://stackoverflow.com/questions/5270272/how-to-determine-day-of-week-by-passing-specific-date –

ответ

3

Вы только должны использовать modulu и редактировать свои дела:

switch (dayNumber%7) { 
     case 1: 
      return "Sunday"; 
     case 2: 
      return "Monday"; 
     case 3: 
      return "Tuesday"; 
     case 4: 
      return "Wednesday"; 
     case 5: 
      return "Thursday"; 
     case 6: 
      return "Friday"; 
     case 0:      //change case 7 to case 0 
      return "Saturday"; 
     default: return "N/A"; 
    } 
+2

Когда 'dayNumber% 7' дает результат 7? –

+0

Сейчас я чувствую себя глупо. Спасибо за это – Artemkller545

+0

Он будет работать для индексов на основе нуля - '7% 7 == 0' – ykb

1

вы можете использовать напоминания оператору % для этого

public static String getDayByInteger(int day) { 
    int dayNumber = (day % 7) + 1; 
    switch (dayNumber) { 
     // case 1 to 7 
    } 
} 
+1

+1 Для того, чтобы быть первым, кто понял этот «сложный» вопрос. –

+1

и +1 за сарказм :) –

0

Попробуйте это:

public static String getDayByInteger(int day) { 
    int dayNumber = day % 7; // Formula.. 
    switch (dayNumber) { 
    case 0: 
     return "Sunday"; 
    case 1: 
     return "Monday"; 
    case 2: 
     return "Tuesday"; 
    case 3: 
     return "Wednesday"; 
    case 4: 
     return "Thursday"; 
    case 5: 
     return "Friday"; 
    case 6: 
     return "Saturday"; 
    default: 
     return "N/A"; 
    } 
} 
0

ТЛ; Др

int yourDayNumber = 9 ; // 1 = Sunday, 2 = Monday, … , 8 = Sunday, 9 = Monday, … 
int isoNumber = (((yourDayNumber % 7) - 1) < 1) ? (7 + ((yourDayNumber % 7) - 1)) : ((yourDayNumber % 7) - 1); 
String output = DayOfWeek.of(isoNumber).getDisplayName(TextStyle.FULL , Locale.US) // Or Locale.CANADA_FRENCH or Locale.TAIWAN etc. 

Подробности

Answer by kai является правильным для математической части, используя % 7. Я объединил это в одну отвратительную строку выше, используя ternary function (см. Расширенный код в последнем разделе).

С другой стороны, получив название дня, вы можете использовать новые функции, встроенные в Java, используя классы java.time.

DayOfWeek перечисление

DayOfWeekenum обеспечивает singleton экземпляр для каждого из дней разорвать недели.

Дни пронумерованы согласно стандарту ISO 8601, 1-7 для понедельника по воскресенье.

DayOfWeek dow = DayOfWeek.of(1); // Monday is # 1. 

DayOfWeek::getDisplayName метод переводит название дня в любом человеческом языке, указанном в Locale такого как Locale.US или Locale.CANADA_FRENCH.

String output = DayOfWeek.MONDAY.getDisplayName(TextStyle.FULL , Locale.CANADA_FRENCH); // Or Locale.US or Locale.ITALY etc. 

Лунди

Цель такого перечисления заключается в использовании этих объектов вместо целых чисел. Вместо того, чтобы передавать только простые целые числа, обходите объекты, такие как DayOfWeek. Это делает ваш код более самодокументированным, обеспечивает ряд допустимых значений и предоставляет type-safety.

java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.

Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP.

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и другие.

Первый день недели

Если вы должны рассчитывать в воскресенье в первый день недели, настроить, чтобы получить 8601 значение ISO.

Вычитая один из вашего кода, мы получаем 1-5 за понедельник-пятницу. Это то, что мы хотим для номеров ISO 8601. Но в субботу мы получаем -1, а в воскресенье получаем 0. Я воспользовался этим фактом, добавив отрицательный или нулевой к семи, чтобы получить желаемый ISO-номер 6 для субботы и 7 для воскресенья. Там может быть более аккуратный способ сделать это, но этот подход преуспевает в соответствии с моим ограниченным тестированием.

int yourDayNumber = 8; // 1 = Sunday, 2 = Monday, … , 8 = Sunday, 9 = Monday, etc. 

int modResult = (yourDayNumber % 7); 
int isoNumber = (modResult - 1); 
if (isoNumber < 1) { 
    isoNumber = (7 + isoNumber); 
} else { // Else modResult is 1-5 
    // No code needed here. 
} 

Дамп для консоли.

System.out.println ("yourDayNumber: " + yourDayNumber + " | isoNumber: " + isoNumber + " | DayOfWeek: " + DayOfWeek.of (isoNumber)); 
Смежные вопросы