Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将星期日+时间(hh:mm)转换为日期_Java_Date - Fatal编程技术网

在Java中将星期日+时间(hh:mm)转换为日期

在Java中将星期日+时间(hh:mm)转换为日期,java,date,Java,Date,我将星期一9:30作为字符串,我想要一个日期为下星期一,时间为9:30作为java.util.Date。我该怎么做?您可以创建一个与字符串匹配的字符串。然后使用该类中的.parse方法将字符串转换为日期。有关更详细的答案,请参阅 或者,您可以创建一个对象,解析字符串以设置相应的字段,然后使用.getTime提取日期 编辑 受Gilbert Le Blanc答案的启发,我更简单地制作了他的测试用例。我使用的步骤是: 使用SimpleDataFormat解析包含日期的给定字符串,生成1970年的日期

我将星期一9:30作为字符串,我想要一个日期为下星期一,时间为9:30作为java.util.Date。我该怎么做?

您可以创建一个与字符串匹配的字符串。然后使用该类中的.parse方法将字符串转换为日期。有关更详细的答案,请参阅

或者,您可以创建一个对象,解析字符串以设置相应的字段,然后使用.getTime提取日期

编辑 受Gilbert Le Blanc答案的启发,我更简单地制作了他的测试用例。我使用的步骤是:

使用SimpleDataFormat解析包含日期的给定字符串,生成1970年的日期。 调整任何DST偏移 计算解析日期过去的周数。 将此周数与过去日期相加,使之成为未来的下一个日期。 我的程序的测试输出与我所在时区的Gilbert相匹配:

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年的日期,并提前足够多的周到下周,你就完成了。