Преобразование строки календаря в объект календаря в java

Я не хочу преобразовывать строковый объект календаря (calendar.toString()) в объект календаря. Я попробовал это решение, но в консоли отображается дата дня «12-05-2017», а не «02-02-2017».

Строковый формат объекта календаря:

java.util.GregorianCalendar[time=1485993600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Африка/Касабланка",offset=0,dstSavings=3600000,useDaylight= true,transitions=102,lastRule=java.util.SimpleTimeZone[id=Africa/Casablanca,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek =1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=10800000,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1, ГОД = 2017, МЕСЯЦ = 1, НЕДЕЛЯ_ГОД = 5, НЕДЕЛЯ_МЕСЯЦ = 1, ДЕНЬ_ОФ_МЕСЯЦ = 2, ДЕНЬ_ОФ_ГОД = 33, ДЕНЬ_НЕДЕЛИ = 5, ДЕНЬ_НЕДЕЛИ_В_МЕСЯЦЕ = 1, AM_PM = 0, ЧАС = 0, ЧАС_ОФ_ДЕНЬ = 0, МИНУТА = 0, СЕКУНДЫ = 0, МИЛЛИСЕКУНД = 0, ZONE_OFFSET = 0, DST_OFFSET = 0]

             Calendar calendar = GregorianCalendar.getInstance();
             calendar.setTime(new Date("2017/02/02"));
             System.out.println("calendar : "+calendar.getTime());
             try {
                 GregorianCalendar gc = new GregorianCalendar();
                 DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
                 System.out.println("calendar : "+calendar.getTime());
                 gc.setTimeZone(TimeZone.getTimeZone(calendar.toString()));
                 System.out.println("tme zone : "+gc.getTimeZone());
                 System.out.println("calendar : "+calendar.getTime());
                 System.out.println("calendar : "+calendar.toString());
                 System.out.println(formatter.format(gc.getTime()));
             }
             catch(Exception e) {
                 //If exception, return server TimeStamp
             }

Любая помощь, пожалуйста


person imane    schedule 11.05.2017    source источник
comment
Какой раствор пробовал? Вы не опубликовали код.   -  person azurefrog    schedule 12.05.2017
comment
Ах, нет. Я бы подумал о сохранении информации о времени (длинном) и часовом поясе, возможно, о форматировании в String, но я бы не стал пытаться анализировать значение toString из Calendar... Я бы также предложил взглянуть на новый Java Time API, так как он поддерживает и количество форматов ISO из коробки   -  person MadProgrammer    schedule 12.05.2017
comment
@azurefrog Я добавил код в свой пост   -  person imane    schedule 12.05.2017
comment
Первая проблема заключается в том, что Calendar является абстрактным классом, а GregorianCalendar является наиболее широко используемым подклассом. Если вы знаете только, что у вас есть объект Calendar, у вас может быть экземпляр другого подкласса с совершенно другим методом toString. Вы вызываете GregorianCalendar.getInstance(), но это вызов Calendar.getInstance() и не гарантирует экземпляр GregorianCalendar.   -  person Ole V.V.    schedule 12.05.2017
comment
Я знаю, что это слишком упрощенный ответ: используйте java.time.LocalDate вместо GreforianCalendar. LocalDate.parse() легко разберет строку из LocalDate.toString().   -  person Ole V.V.    schedule 12.05.2017
comment
Я чувствую, что это можно сделать с помощью GregorianCalendar, или, по крайней мере, вы можете приблизиться, но это потребует много работы по разбору.   -  person Ole V.V.    schedule 12.05.2017
comment
Почему ты вообще хочешь это сделать?   -  person Ole V.V.    schedule 12.05.2017


Ответы (4)


Если бы это был я, я бы посмотрел на все сеттеры как Calendar, так и GregorianCalendar и посмотрел, смогу ли я извлечь из строки значения, необходимые для сеттеров. «time=1485993600000» должно дать вам самую важную информацию, время, и вы можете ввести ее в setTimeInMillis(). Вы должны быть в состоянии получить часовой пояс из «Африка/Касабланка». И так далее. Вероятно, вы можете использовать регулярные выражения для извлечения полей из строки.

Вероятно, вам придется смириться с тем, что вы не охватите все случаи. Ваш конкретный GregorianCalendar, кажется, содержит sun.util.calendar.ZoneInfo и java.util.SimpleTimeZone; Я не знаю, всегда ли это так, и какие еще есть возможности.

Строгая проверка вашей попытки проста: просто вызовите toString() еще раз на своем только что созданном экземпляре и посмотрите, получите ли вы ту же строку. Трудность возникает, если вы принимаете какие-то различия и вам нужно определить, лежат ли фактические различия в пределах того, что вы решили принять.

Или действительно, я бы не хотел беспокоиться, если бы мог этого избежать. Я хотел бы найти более легкую задачу или более простой способ получить то, что вы действительно пытаетесь получить. Как я уже сказал в комментарии, можно использовать java.time.LocalDate вместо GregorianCalendar. LocalDate.parse() легко разберет строку из LocalDate.toString(), и проблема будет решена. Просто чтобы привести один пример другого взгляда на это.

person Ole V.V.    schedule 12.05.2017

В вашем коде есть два отдельных объекта GregorianCalendar — один называется calendar, а другой — gc. Вы устанавливаете один объект календаря на нужную дату, а затем распечатываете другой.

person Dawood ibn Kareem    schedule 12.05.2017
comment
Извините, @OleV.V. Думаю, я слишком остро отреагировал. Я по-прежнему считаю, что суть дела в том, что он присвоил значение calendar, а затем напечатал gc, ожидая, что его значение волшебным образом переместится с одного объекта на другой - это проблема, на которую ваш ответ никогда не обращался. Однако ваш ответ содержит отличную другую информацию, и она явно была полезна для того, чтобы привести OP к правильному ответу. Еще раз прошу прощения за мой предыдущий комментарий. - person Dawood ibn Kareem; 13.05.2017
comment
Никаких тяжелых чувств. - person Ole V.V.; 13.05.2017

Спасибо @Ole, я наконец нашел решение, и оно работает.

             Calendar calendar = Calendar.getInstance();;
             calendar.setTime(new Date("2017/02/02"));
             String[] ds = calendar.toString().split("=");
             String[] ds2 = ds[1].split(",");
             try {
                 Calendar cal = Calendar.getInstance();;
                 DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
                 cal.setTimeInMillis(Long.valueOf(ds2[0]));
                 System.out.println(formatter.format(cal.getTime()));
             }
             catch(Exception e) {

             }
person imane    schedule 13.05.2017

Java.время

Вы используете ужасные старые классы, которые теперь вытеснены гораздо более совершенными классами java.time.

Создайте экземпляр LocalDate. Класс LocalDate представляет значение без времени суток и без часового пояса.

LocalDate ld = LocalDate.parse( "2017-02-02" ) ;

Чтобы сгенерировать строку в стандартном формате ISO 8601, вызовите toString.

String output = ld.toString() ;

2017-02-02

Для других форматов используйте класс DateTimeFormatter.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
String output = ld.format( f ) ;

02-02-2017

Ваш вопрос не ясен. Если проблема в том, что вашему коду передается объект GregorianCalendar, преобразуйте его в java.time.ZonedDateTime. Вызывать новые методы преобразования, добавленные к старым классам.

if( myCalendar instanceOf GregorianCalendar ) {
    ZonedDateTime zdt = myCalendar.toZonedDateTime() ;
}

Извлеките желаемое значение только для даты в виде файла LocalDate.

LocalDate ld = zdt.toLocalDate() ;

О java.time

Платформа java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.

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

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

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

person Basil Bourque    schedule 30.10.2017