2013-05-07 2 views
5

У меня есть небольшая программа, которая отображает текущую неделю с сегодняшнего дня, как это:Java: Получить номер недели с любой даты?

GregorianCalendar gc = new GregorianCalendar(); 
    int day = 0; 
    gc.add(Calendar.DATE, day); 

А потом JLabel, который отображает номер недели:

JLabel week = new JLabel("Week "+gc.get(Calendar.WEEK_OF_YEAR)); 

Так прямо сейчас я хотел бы иметь JTextField, где вы можете ввести дату, а JLabel будет обновляться с номером недели этой даты. Я действительно не уверен, как это сделать, поскольку я совершенно новичок в Java. Нужно ли сохранять ввод в виде строки? Целое число? И в каком формате он должен быть (yyyyMMdd и т. Д.)? Если бы кто-нибудь мог мне помочь, я был бы признателен!

+0

Вы должны разобрать вход с указанным форматом. Это может помочь: http://stackoverflow.com/questions/3386520/parse-date-from-string-in-this-format-dd-mm-yyyy-to-dd-mm-yyyy –

+0

FYI, сложная старая дата -time-классы, такие как ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java.util.Calendar' ] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) и 'java.text.SimpleTextFormat' теперь [legacy] (https: //en.wikipedia .org/wiki/Legacy_system), вытесняется классами [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

ответ

16

Нужно ли сохранять входные данные в виде строки? Целое число?

При использовании JTextField, вход вы получаете от пользователя является String, поскольку дата может содержать символы, такие как . или -, в зависимости от формата даты вы выбираете. Разумеется, вы также можете использовать несколько более сложных методов ввода, в которых поле ввода уже проверяет формат даты и возвращает отдельные значения для дня, месяца и года, но с JTextField, конечно, легче начать.

И какой формат он должен быть (yyyyMMdd и т. Д.)?

Это зависит от ваших требований. Вы можете использовать SimpleDateFormat класс для разбора любого формата даты:

String input = "20130507"; 
String format = "yyyyMMdd"; 

SimpleDateFormat df = new SimpleDateFormat(format); 
Date date = df.parse(input); 

Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
int week = cal.get(Calendar.WEEK_OF_YEAR); 

Но более вероятно, что вы хотите использовать формат дату, специфичный для вашей местности:

import java.text.DateFormat; 

DateFormat defaultFormat = DateFormat.getDateInstance(); 
Date date = defaultFormat.parse(input); 

Чтобы дать пользователю подсказку, какой формат для использования, вы должны бросить DateFormat к SimpleDateFormat, чтобы получить строку шаблона:

if (defaultFormat instanceof SimpleDateFormat) { 
    SimpleDateFormat sdf = (SimpleDateFormat)defaultFormat; 
    System.out.println("Use date format like: " + sdf.toPattern()); 
} 

комментарий по @adenoyelle выше напоминает мне: Напишите модульные тесты для кода анализа даты.

+1

Спустя годы, этот ответ устарел с улучшениями Java. Неудобные старые классы времени, такие как ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java. util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) и 'java.text.SimpleTextFormat' теперь [legacy] (https://en.wikipedia.org/wiki/Legacy_system), вытесненный классами [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) , См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Вы можете использовать это, но вам необходимо проанализировать значение даты до формата даты, используя SimpleDateFormatter из java API. Вы можете указать любой желаемый формат. После этого вы сможете манипулировать, чтобы получить неделю в году.

3

Вы можете сохранить дату в виде строки, и пользователь может ввести ее в любом формате, который вы указали. Вам просто нужно использовать объект DateFormat для интерпретации даты ввода. Например, см. top answer по адресу Convert String to Calendar Object in Java.

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011")); 

Чтобы прочитать дату из JTextField, вы можете заменить что-то вроде:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // or any other date format 
cal.setTime(sdf.parse(dateTextField.getText())); 

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

0
public static int getWeek() { 
     return Calendar.getInstance().get(Calendar.WEEK_OF_YEAR); 
    } 

работает отлично и возвращение недели для текущего реального времени

5

Java 1.8 предоставляет вам некоторые новые классы в пакете java.time:

import java.time.Instant; 
import java.time.ZoneId; 
import java.time.ZonedDateTime; 
import java.time.temporal.IsoFields; 

ZonedDateTime now = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()); 
System.out.printf("Week %d%n", now.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)); 

Большинство унаследованных календари могут быть легко преобразованы в java.time.ZonedDateTime/java.time.Instant методами функциональной совместимости, в частности, ваш кейс GregorianCalendar.toZonedDateTime().

3

Т.Л., д-р

YearWeek.of(LocalDate.parse("2017-01-23")) 
     .getWeek() // and .getYear() 

ISO 8601 стандарт недели

Если вы хотите стандартный ISO 8601 week, а не локализованное определение недели, используйте YearWeek класс, найденный в проекте ThreeTen-Extra, который добавляет функциональность к классам java.time, встроенным в Java 8 и более поздние версии.

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

Во-первых, получите сегодняшнюю дату. Класс LocalDate представляет собой значение даты только без времени и без часового пояса.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Paris France - это новый день, пока еще «вчера» в Montréal Québec.

Указать proper time zone name в формате continent/region, такие как America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, такую ​​как EST или IST, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Или позвольте пользователю указать дату, введя строку. Разбор строки ввода даты охватывает в много другие вопросы и ответы. Проще всего использовать пользовательский стандарт ISO 8601, YYYY-MM-DD, такой как 2017-01-23.

LocalDate ld = LocalDate.parse("2017-01-23") ; 

Для других форматов, указать DateTimeFormatter для синтаксического анализа. Поиск переполнения стека для многих примеров использования этого класса.

DateTimeFormatter f = DateTimeFormatter.ofPattern("d/M/uuuu" , Locale.US) ; 
LocalDate ld = LocalDate.parse("1/23/2017" , f) ; 

Получить YearWeek.

YearWeek yw = YearWeek.of(ld) ; 

Чтобы создать строку, рассмотреть вопрос об использовании standard ISO 8601 format for year-week, YYYY-Www, такие как 2017-W45. Или вы можете извлечь каждый номер.

  • YearWeek::getWeek - Получает поле недели недели недели.
  • YearWeek::getYear - Получает поле недели за год.

О java.time

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

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

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

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

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

0

это один работал для меня

public void sortListItems(List<PostModel> list) { 
    Collections.sort(list, new Comparator<PostModel>() { 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     @Override 
     public int compare(PostModel o1, PostModel o2) { 
      int ret = 0; 
      try { 
       ret = dateFormat.parse(o1.getDate()).compareTo(dateFormat.parse(o2.getDate())); 
       return ret; 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

      return ret; 
     } 
    }); 
} 
Смежные вопросы