1

我想创建一个日期时间字符串,其格式类似于2013-08-30T15:06:00使用三个字符串。一个字符串有日期"30-aug-2013",第二个字符串有时间"15:06",最后一个字符串有天值"2"。现在我想使用这三个字符串来创建一个结果字符串,如"2013-08-28T15:06:00"。days 值是创建过去的日期,因此在这种情况下,日期从8 月30日更改为8 月 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

4 回答 4

2

如果您的时间String始终采用这种格式,则需要使用time.split(":")来获取小时和分钟。

您可能还想指定输出格式而不是使用Locale默认格式。

添加减号以减去而不是添加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

于 2013-09-04T13:11:06.953 回答
0
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
于 2013-09-04T12:58:03.850 回答
0

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());

印刷:

2013 年 8 月 6 日星期二 00:00:00 EDT

于 2013-09-04T13:11:49.747 回答
0

避免使用 juDate 和 .Calendar

java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。而是使用Joda-Time库。

时区

其他答案忽略了时区的关键问题。您必须指定此字符串是否表示巴黎、Tukwila 或加尔各答的日期时间。如果不指定,则应用 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,因为 Date 没有时区。

java.util.Date date = dateTime.toDate();
于 2014-06-05T18:43:20.960 回答