2016-02-07 4 views
1

Я пытаюсь использовать метод date.format (DateTimeFormatter formatter) для форматирования списка строк даты, где 'date' является объектом java.time.LocalDate, например. Проблема в том, что я не могу найти прямой способ создания объекта Year из строки. Например, если у меня есть строка yearString = "90". Я хотел бы создать объект Year, равный этому значению, а затем использовать метод format для вывода yearStringNew = "1990". Ближайшим я вижу публичный конструктор функцию now(), которая возвращает текущее время.Возможно создать объект Java.time.LocalDate из строки?

Я также изучил создание объекта «Календарь», а затем создаю там объект даты, способный к форматированию, но я могу создать объект Java.util.Date - в отличие от объекта в пакете Java.time, который мог бы тогда идеально форматируется функцией формата. Я что-то упустил?

FYI Я ссылающийся на Java 8 SDK Javadoc https://docs.oracle.com/javase/8/docs/api/

Спасибо за ваше время.

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

//Module 3: 
//Format Date Segments 

package challenge245E; 

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Arrays; 
import java.util.Date; 

public class TestClass3 { 

    public static void main(String[] args) throws ParseException { 

     DateFormatter dateFormatter = new DateFormatter(); 

     String myGroupedSlices [][] = 

      { 
       {"1990", "12", "06"}, 
       {"12","6", "90"} 
      }; 

     dateFormatter.formatDates(myGroupedSlices); 

     } 

    } 

class DateFormatter { 

    public Date[][] formatDates(String[][] groupedDates) throws ParseException { 

     Date[][] formattedDates = new Date[groupedDates.length][3]; 

     DateFormat yearFormat = new SimpleDateFormat("YYYY"); 
     DateFormat monthFormat = new SimpleDateFormat("MM"); 
     DateFormat dayFormat = new SimpleDateFormat("dd"); 

     //iterate through each groupedSlices array 
     for (int i=0; i<groupedDates.length;i++) { 

      //Conditions 

      if (groupedDates[i][0].length()<3) { 
       //MDDYY format: if date[0].length < 3 

       //Re-arrange into YDM order 
       String m = groupedDates[i][0]; 
       String y = groupedDates[i][2];  
       groupedDates[i][0] = y; 
       groupedDates[i][2] = m; 

       //convert dates to correct format 
       formattedDates[i][0] = yearFormat.parse(groupedDates[i][0]); 
       formattedDates[i][1] = monthFormat.parse(groupedDates[i][1]); 
       formattedDates[i][2] = dayFormat.parse(groupedDates[i][2]); 

       //testing if block 
       System.out.println("MDY Order: " + Arrays.toString(formattedDates[i])); 

      } 

      if (groupedDates[i][0].length()>3) { 
       //YYYYMMDD format: if date[0].length > 3 

       //convert dates to correct format 
       formattedDates[i][0] = yearFormat.parse(groupedDates[i][0]); 
       formattedDates[i][1] = monthFormat.parse(groupedDates[i][1]); 
       formattedDates[i][2] = dayFormat.parse(groupedDates[i][2]); 

       //testing if block 
       System.out.println("YMD Order: " + Arrays.toString(formattedDates[i])); 
      } 


     } 

     return formattedDates; 
    } 
} 
+0

см [Joda-время, как к разбору-а-нить к Joda-LocalDate] (Http: // codetutr.com/2013/03/05/joda-time-how-to-parse-a-string-to-joda-localdate /) –

ответ

1

Анализировать Каждый номер Отдельно

Это хорошо, чтобы видеть вас, используя java.time структуру, а не назойливых старых классов даты и времени. Старые классы java.util.Date/.Calendar были заменены новой структурой.

Класс DateTimeFormatter анализирует любой двухзначный год как находящийся в 2000-х годах. Из класса doc:

Если количество букв равно двум ... будет анализироваться с использованием базового значения 2000, что приведет к году в диапазоне от 2000 до 2099 включительно.

Чтобы устранить эту проблему, см. this Answer от assylias. Но этот вопрос может быть спорным в вашем случае. У вас уже есть отдельные значения года, месяца и даты. Поэтому им не нужно разбираться вместе.

Я предлагаю вам конвертировать каждую строку в целое число. За год, если меньше 100, то добавьте 1900.

String inputYear = "90"; 
String inputMonth = "12"; 
String inputDayOfMonth = "6"; 

int year = Integer.parseInt(inputYear); 
int month = Integer.parseInt(inputMonth); 
int dayOfMonth = Integer.parseInt(inputDayOfMonth); 

if(year < 100) { // If two-digit year, assume the 1900s century. Even better: Never generate two-digit year text! 
    year = (year + 1900); 
} 

LocalDate localDate = LocalDate.of(year , month , dayOfMonth); 
+0

Я столкнулся с проблемой с 2000 по 2099 год, пытаясь разобрать эту конкретную дату раньше - полезно хотя бы знать, теперь нет встроенного способа обойти это. Что касается двухзначного года - конкретный сценарий включает в себя форматирование множества дат, некоторые из которых могут иметь двузначный год - в любом случае я создал аналогичную ветку «если», которая была написана выше для такого случая. Спасибо за ваш ответ, это было очень полезно. Если бы у меня была привилегия, было бы наоборот. – BenWS

+0

@BenWS Там * есть встроенный способ обойти это. См. [Этот ответ] (http://stackoverflow.com/a/32505814/642706). Я связан. Используйте 'DateTimeFormatterBuilder' и вызывайте' appendValueReduced'. –

2

Если я правильно понимаю ваши требования правильно, есть взгляд на LocalDate.parse() методов.

Пример:

LocalDate date = LocalDate.parse("1990-01-01", DateTimeFormatter.ofPattern("yyyy-MM-dd")); 
int year = date.getYear(); // 1990 
+0

Спасибо за этот ответ - у меня возникли проблемы с методомPattern для форматирования даты года (Например, «90», в отличие от «90-01-12»), но я нашел способ обойти это. В следующий раз мне придется взглянуть на методы класса. Еще раз спасибо! Если бы была привилегия, было бы выгодно. – BenWS

0

Создание экземпляра класса GregorianCalendar, установить дату в этом календаре, а затем использовать метод toZonedDateTime(). Это даст вам экземпляр ZonedDateTime. его формы вы можете использовать метод LocalDate.from (TemporalAccessor temporal) для получения вашего LocalDate. Вот как это может выглядеть:

//.... 
GregorianCalendar calendar = new GregorianCalendar(); 
// Set the deasired date in your calendar 
LocalDate localDate = LocalDate.from(calendar.toZonedDateTime()); 
//... 
Смежные вопросы