Как я могу создать строку DateTime, используя строку даты и строку времени?

Я хочу создать строку DateTime со следующим форматом 2013-08-30T15:06:00 используя три строки. Одна строка имеет дату "30-aug-2013" и вторая строка имеет время "15:06" и последняя строка имеет значение дней "2". Теперь я хочу использовать эти три строки для создания результирующей строки, как "2013-08-28T15:06:00", Значение дней - создание даты в прошлом, поэтому в этом случае дата меняется с 30 августа на 28 августа

Решение, которое я попробовал:

public String getFormattedDate(String date, String selectedDays, String time) {
    String dtStart = date;  
    SimpleDateFormat  format = new SimpleDateFormat("dd-MM-yyyy");  
    try {  
        Date dateObject = format.parse(dtStart);  
        System.out.println(date);  
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(dateObject);
        calendar.add(Calendar.DAY_OF_MONTH, Integer.valueOf(selectedDays));
        System.out.println(calendar.getTime()); 
    } catch (ParseException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }
}

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

4 ответа

Решение

Если ваше время String всегда в этом формате, вам нужно будет использовать time.split(":") чтобы получить часы и минуты.

Возможно, вы захотите указать формат вывода вместо использования Locale формат по умолчанию также.

Добавьте знак минус в substract вместо добавления для Calendar.add(),

Ваш код использовать dd-MM-yyyy но твоя месячная часть написана, 08-aug-2013 который должен быть проанализирован с помощью dd-MMM-yyyy вместо.

Это должно вывести как вы указали

  public static String getFormattedDate(String date, String selectedDays, String time) {
    String dtStart = date;
    Calendar calendar = new GregorianCalendar();
    calendar.clear();
    SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy"); // This should be MMM and not MM according to the date format 08-aug-2013
    try {
      Date dateObject = format.parse(dtStart);
      System.out.println(date);
      calendar.setTime(dateObject);
      String[] hoursMins = time.split(":");
      int hours = Integer.valueOf(hoursMins[0]);
      int minutes = Integer.valueOf(hoursMins[1]);
      calendar.set(Calendar.HOUR_OF_DAY, hours);
      calendar.set(Calendar.MINUTE, minutes);
      calendar.set(Calendar.SECOND, 0); // Here, I have no idea where you get the seconds, so I just set them to 0
      calendar.add(Calendar.DAY_OF_MONTH, -Integer.valueOf(selectedDays)); // Add a minus sign to substract
      // System.out.println(calendar.getTime());
      // Use a SimpleDateFormat instead

      System.out.println(outputFormat.format(calendar.getTime()));
      // System.out.println(calendar.getTime());
    } catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    return outputFormat.format(calendar.getTime());
  }

Если вы хотите почитать о форматировании символов, проверьте нижнюю часть этой ссылки, она довольно хорошо объяснена.

призвание getFormattedDate("08-aug-2013", "2", "15:05"); с этим выводом кода 2013-08-06T15:05,

Редактировать: я забыл секунды, вывод теперь: 2013-08-06T15:05:00

Calendar.add Можно удалить дни, добавив отрицательное значение:

SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");  <-- check your format      
Date d = format.parse("08-aug-2013");

Calendar c = new GregorianCalendar();
c.setTime(d);
c.add(Calendar.DAY_OF_MONTH, -2);  <-- see that you are parsing to a negative int
System.out.println(c.getTime());

Печать:

Вт Авг 06 00:00:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2013

Избегайте juDate & .Calendar

Классы java.util.Date и.Calendar печально известны своими проблемами. Избежать их. Вместо этого используйте библиотеку Joda-Time.

Часовой пояс

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

язык

В других ответах не указывается язык, на котором нужно анализировать название месяца.

Пример использования Joda-Time

String input = "30-aug-2013" + "15:06";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d-MM-yyyyH:mm" );
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
java.util.Locale locale = java.util.Locale.ENGLISH;
DateTime dateTime = formatter.withLocale( locale ).withZone( timeZone ).parseDateTime( input" );

Если необходимо, преобразуйте в java.util.Date, автоматически адаптируясь к UTC, поскольку Дата не имеет часового пояса.

java.util.Date date = dateTime.toDate();
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);

String date = mYear + "-" + mMonth + "-" + mDay; // + time + ... so on
Другие вопросы по тегам