我有"Monday, 9:30"
字符串,我希望下周一的Date
时间为9:30 java.util.Date
。我该怎么做?
答案 0 :(得分:2)
您可以创建与您的字符串匹配的SimpleDateFormat。然后,您将使用该类中的.parse()
方法将String转换为Date
。有关更详细的答案,请参阅this question。
或者,您可以创建Calendar对象,并解析字符串以设置其相应字段,然后使用.getTime()
提取Date
。
修改强> 灵感来自Gilbert Le Blanc的回答,我更简单地制作了他的测试用例。我使用的步骤是:
SimpleDateFormat
解析包含日期的给定字符串,在1970年生成日期。我的节目的测试输出与吉尔伯特(在我的时区)匹配:
Monday, 9:30 --> Mon May 23 09:30:00 PDT 2016
Friday, 16:45 --> Fri May 20 16:45:00 PDT 2016
Wednesday, 22:15 --> Wed May 18 22:15:00 PDT 2016
您可以根据“下一步”的真正含义来调整方法。这是我的完整代码:
package foo.bar;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DayTime {
public static final long MILLISECONDS_PER_WEEK = 7L * 24 * 60 * 60 * 1000;
public static void main(String[] args) {
getDate("Monday, 9:30");
getDate("Friday, 16:45");
getDate("Wednesday, 22:15");
}
private static void getDate(String input) {
// Parse given date. Convert this to milliseconds since epoch. This will
// result in a date during the first week of 1970.
SimpleDateFormat sdf = new SimpleDateFormat("E, H:mm");
Date date = sdf.parse(input, new ParsePosition(0));
// Convert to millis and adjust for offset between today's Daylight
// Saving Time (default for the sdf) and the 1970 date
Calendar c = Calendar.getInstance();
int todayDSTOffset = c.get(Calendar.DST_OFFSET);
c.setTime(date);
int epochDSTOffset = c.get(Calendar.DST_OFFSET);
long parsedMillis = date.getTime() + (epochDSTOffset - todayDSTOffset);
// Calculate how many weeks ago that was
long millisInThePast = System.currentTimeMillis() - parsedMillis;
long weeksInThePast = millisInThePast / MILLISECONDS_PER_WEEK;
// Add that number of weeks plus 1
Date output = new Date(parsedMillis + (weeksInThePast + 1) * MILLISECONDS_PER_WEEK);
System.out.println(input + " --> " + output);
}
}
答案 1 :(得分:1)
我写了一个转换程序。以下是测试结果。
Monday, 9:30 --> Mon May 23 09:30:00 MDT 2016
Friday, 16:45 --> Fri May 20 16:45:00 MDT 2016
Wednesday, 22:15 --> Wed May 18 22:15:00 MDT 2016
我假设输入时间是24小时。我在山区时区(MDT)。日期结果将在您运行此代码的任何时区。
我还假设如果今天的工作日与输入工作日相同,我今天输出日期。随意添加代码以检查当前时间,以查看约会是今天还是下周。我认为这超出了要求的范围。
这是我创建日期输出的方式。
我将输入分为","。
我创建了一个包含当前日期和时间的Calendar对象。
我将工作日文本转换为工作日整数。
我添加了到达下一个工作日整数所需的天数。
我使用SimpleDateFormat解析时间部分,并将时间复制到Calendar对象。
这是代码。这并不简单。
package com.ggl.testing;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DayTime {
public static void main(String[] args) {
getDate("Monday, 9:30");
getDate("Friday, 16:45");
getDate("Wednesday, 22:15");
}
private static void getDate(String input) {
DayTime dayTime = new DayTime();
Date output = dayTime.createDate(input);
System.out.println(input + " --> " + output);
}
public Date createDate(String input) {
String[] parts = input.split(", ");
Calendar now = Calendar.getInstance();
setDate(parts, now);
setTime(parts[1], now);
return now.getTime();
}
private void setDate(String[] parts, Calendar now) {
int weekday;
switch (parts[0]) {
case "Sunday":
weekday = Calendar.SUNDAY;
break;
case "Monday":
weekday = Calendar.MONDAY;
break;
case "Tuesday":
weekday = Calendar.TUESDAY;
break;
case "Wednesday":
weekday = Calendar.WEDNESDAY;
break;
case "Thursday":
weekday = Calendar.THURSDAY;
break;
case "Friday":
weekday = Calendar.FRIDAY;
break;
default:
weekday = Calendar.SATURDAY;
break;
}
int currentWeekday = now.get(Calendar.DAY_OF_WEEK);
if (weekday == currentWeekday) {
return;
}
int difference = (weekday - currentWeekday + 7) % 7;
now.add(Calendar.DAY_OF_MONTH, difference);
}
@SuppressWarnings("deprecation")
private void setTime(String part, Calendar now) {
Date date = getTime(part);
if (date != null) {
now.set(Calendar.HOUR_OF_DAY, date.getHours());
now.set(Calendar.MINUTE, date.getMinutes());
now.set(Calendar.SECOND, date.getSeconds());
}
}
private Date getTime(String part) {
SimpleDateFormat sdf = new SimpleDateFormat("H:mm");
try {
return sdf.parse(part);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}