在Java中将星期日+时间(hh:mm)转换为日期
我将星期一9:30作为字符串,我想要一个日期为下星期一,时间为9:30作为java.util.Date。我该怎么做?您可以创建一个与字符串匹配的字符串。然后使用该类中的.parse方法将字符串转换为日期。有关更详细的答案,请参阅 或者,您可以创建一个对象,解析字符串以设置相应的字段,然后使用.getTime提取日期 编辑 受Gilbert Le Blanc答案的启发,我更简单地制作了他的测试用例。我使用的步骤是: 使用SimpleDataFormat解析包含日期的给定字符串,生成1970年的日期。 调整任何DST偏移 计算解析日期过去的周数。 将此周数与过去日期相加,使之成为未来的下一个日期。 我的程序的测试输出与我所在时区的Gilbert相匹配:在Java中将星期日+时间(hh:mm)转换为日期,java,date,Java,Date,我将星期一9:30作为字符串,我想要一个日期为下星期一,时间为9:30作为java.util.Date。我该怎么做?您可以创建一个与字符串匹配的字符串。然后使用该类中的.parse方法将字符串转换为日期。有关更详细的答案,请参阅 或者,您可以创建一个对象,解析字符串以设置相应的字段,然后使用.getTime提取日期 编辑 受Gilbert Le Blanc答案的启发,我更简单地制作了他的测试用例。我使用的步骤是: 使用SimpleDataFormat解析包含日期的给定字符串,生成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);
}
}
我写了一个转换程序。这是测试结果
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。日期结果将位于运行此代码的任何时区
我还假设,如果今天的工作日与输入的工作日相同,则输出今天的日期。请随意添加代码以检查当前时间,查看约会是今天还是下周。我认为这超出了要求的范围
下面是我如何创建日期输出的
我将输入拆分为
我用当前日期和时间创建了一个日历对象
我将工作日文本转换为工作日整数
我添加了到达下一个工作日整数所需的天数
我使用SimpleDataFormat解析时间部分,并将时间复制到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;
}
}
}
首先你需要一些代码请在发布前搜索堆栈溢出。由于SimpleDataFormat在内部使用日历,默认值恰好在1970年,这有点过分了。只需解析到1970年的日期,并提前足够多的周到下周,你就完成了。