我想使用三个字符串创建一个格式为2013-08-30T15:06:00
的DateTime字符串。一个字符串包含日期"30-aug-2013"
,第二个字符串包含时间"15:06"
,最后一个字符串包含天数{{1}现在我想使用这三个字符串创建一个像"2"
这样的结果字符串。天数值是在过去创建日期,因此在这种情况下,日期从 30th aug 变为 28 aug
解决方案我尝试过:
"2013-08-28T15:06:00"
在上面的解决方案中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();
}
}
将添加日期,而不是从日期中删除天数。此外,我不知道如何使用时间字符串在日期对象上设置它。 / p>
答案 0 :(得分:1)
如果您的时间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());
}
如果您想了解格式化符号的好地方,请查看the bottom of this link,这是很好的解释。
使用此代码输出getFormattedDate("08-aug-2013", "2", "15:05");
调用2013-08-06T15:05
。
编辑:我忘了秒,输出现在是:2013-08-06T15:05:00
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
java.util.Date和.Calendar类非常麻烦。避免他们。而是使用Joda-Time库。
其他答案忽略了时区的关键问题。您必须指定此字符串是否表示巴黎,Tukwila或加尔各答的日期时间。如果未指定,则应用JVM的默认时区。
其他答案未能指定解析月名的语言。
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();