Как преобразовать 24-часовую временную строку в стандартную дату Java наоборот? - PullRequest
3 голосов
/ 28 февраля 2012

Я хотел бы иметь две функции:

  1. Скажем, у меня есть дата в строке "11/12/2011" и время в строке: "0200". Я хотел бы простую функцию (если это возможно), которая принимает два параметра (дата и время сверху) в Java, который преобразует его в 12/12/2011 2:00 AM в объекте Java Date.

  2. Скажем, у меня есть объект java Date в качестве единственного параметра (например, 12.11.2011, 2:00), который возвращает военное время из него (например, "0200").

Есть ли какая-нибудь java-библиотека или как лучше всего выполнить вышеперечисленное? Или в java Date есть что-то, что позволяет легко получить что-то военное время по сравнению с обычным временем, которое использует Java date?

Ответы [ 6 ]

3 голосов
/ 28 февраля 2012
new SimpleDateFormat("MM/dd/yyyy HHmm").parse("11/12/2011" + " " + "0200");
new SimpleDateFormat("MM/dd/yyyy HHmm").format(new Date());
new SimpleDateFormat("HHmm").format(new Date());

(при условии, что военные в США по-прежнему ставят месяц первым в датах).

[править: вам также нужно беспокоиться о вашем часовом поясе - для анализа часто проще просто добавить это.например:

new SimpleDateFormat("MM/dd/yyyy HHmm Z").parse("11/12/2011" + " " + "0200" + " PST");

(может, военные всегда используют UTC? Понятия не имею ...).а для форматирования вы можете установить часовой пояс для экземпляра SDF, используя setTimezone ().]

1 голос
/ 28 февраля 2012

Вы можете использовать SimpleDateFormat.parse с соответствующей строкой формата.

0 голосов
/ 01 октября 2016

ТЛ; др

LocalDateTime ldt = LocalDateTime.of( 
    LocalDate.parse( 
        "11/12/2011" , 
        DateTimeFormatter.ofPattern( "mm/DD/uuuu" ) 
    ) 
    , 
    LocalTime.parse( 
        "0200" ,
        DateTimeFormatter.ofPattern( "HHmm" ) 
    )
)

24-часовые часы это «нормальный»

Нет такого понятия, как "нормальное время" и "военное время". Большинство людей на планете свободно владеют как 12-часовым, так и 24-часовым временем для важных дел, таких как расписание поездов. Термин «военное время» в основном используется в Соединенных Штатах, где, как ни странно, мало кто за пределами армии знает круглосуточное время.

Избегайте устаревших классов даты и времени

Избегайте проблемных старых классов даты и времени, таких как java.util.Date и .Calendar. Теперь вытеснены классами java.time .

У вас есть значение только для даты и значение времени дня, и вы хотите объединить их. Итак, сначала установите каждую часть.

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса. Точно так же класс LocalTime представляет время суток без даты и без часового пояса.

LocalDate

Вы можете указать явный шаблон форматирования.

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern( "mm/DD/uuuu" ).withLocale( Locale.US );
LocalDate ld = LocalDate.parse( "11/12/2011" , dateFormatter );

ld.toString (): 2011-01-12

LocalTime

И сделать то же самое для времени суток.

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern( "HHmm" );
LocalTime lt = LocalTime.parse( "0200" , timeFormatter );

lt.toString (): 02: 00

LocalDateTime

Соедините эти две части в LocalDateTime.

LocalDateTime ldt = LocalDateTime.of( ld , lt );

LocalDateTime не представляет фактический момент, точку на временной шкале. Этот объект не имеет реального значения без контекста смещения от UTC или часового пояса. Момент времени 2 часа ночи в Окленде, Новая Зеландия, - это часы на 2 часа утра в Калькутте, который на два часа раньше, чем 2 часа ночи в Париже, и еще позже - 2 часа ночи в Монреале, Квебеке, Калифорния.

Из LocalDateTime вы можете извлечь LocalDate или LocalTime, когда вы снова захотите указать значение только для даты или времени дня, как указано в вопросе.

LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();

ZonedDateTime

Если вам известно смещение от UTC , предназначенное для этого значения, примените ZoneOffset, чтобы получить OffsetDateTime. Еще лучше использовать часовой пояс , если известен, ZonedId, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );

zdt.toString (): 2011-01-12T02: 00: 00-05: 00 [Америка / Монреаль]

Из ZonedDateTime вы можете извлечь LocalDate или LocalTime, когда вам снова понадобится значение только для даты или времени дня, как было запрошено в вопросе.

LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();

Преобразование

Лучше всего избегать java.util.Date как Чума. Но если вам нужно работать со старым кодом, который еще не обновлен до типов java.time, вы можете преобразовать его в / из java.time, вызвав новые методы, добавленные к старым классам. Из ZonedDateTime вы можете извлечь java.time.Instant (момент на временной шкале в UTC) и передать его статическому методу на Date.

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );

Для получения дополнительной информации о преобразовании см. Преобразовать java.util.Date для какого типа «java.time»? .

О java.time

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

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

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

Большая часть функций java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как пользоваться… ).

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

0 голосов
/ 01 октября 2016

Так я и сделал.

Вот мой код:

import java.util.Scanner;

class test{
int h,m,s;

public static void main (String args[]){
    int hour,min,sec;
    String format;
    Scanner obj=new Scanner(System.in);
    hour=obj.nextInt();
    min=obj.nextInt();
    sec=obj.nextInt();
    format=obj.next();
    int h,m,s;

    h=((hour>=00&&hour<24)?hour:0);
    m=((min>=00&&min<60)?min:0);
    s=((sec>=00&&sec<60)?sec:0);

    if(format.equals("PM")){
        h= (h!=12? 12+h :h);
    }else if (h==12)h=0;
    System.out.print(h+":"+m+":"+s);

}}
0 голосов
/ 28 марта 2013

Вот как я это сделал

public static String militaryToOrdinaryTime(int milTime)
    {
       int hour = milTime / 100;
       int min = milTime % 100;
       String period;

       if (hour < 0 || hour > 24 || min < 0 || min > 59)
       {
           return "";
       }
       else if (hour > 12)
       {
           hour = hour - 12;
           period = "pm";
       }
       else
       {
           period = "am";
       }
       if (hour == 0)
       {
           hour = 12;
       }
       else if (min == 0)
       {
           String ordTime = hour + " " + period;
           return ordTime;
       }  
       else if (min < 10 && min > 0)
       {
          String min1 = String.valueOf(min);
min1 = "0" + min1;
String ordTime = hour + ":" + min1 + " " + period;
return ordTime;
       }
       String ordTime = hour + ":" + min + " " + period;
       return ordTime;
    }

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        int time = in.nextInt();

        System.out.println(militaryToOrdinaryTime(time));
    }
}
0 голосов
/ 28 февраля 2012

Попробуйте JodaTime.

http://joda -time.sourceforge.net /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...