Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 将小时间隔转换为24小时间隔_Java_Android_String_Date_Converters - Fatal编程技术网

Java 将小时间隔转换为24小时间隔

Java 将小时间隔转换为24小时间隔,java,android,string,date,converters,Java,Android,String,Date,Converters,我想将“上午9:00–晚上11:00”->“9:00–23:00”转换为“9:00–23:00”,我该怎么做?到目前为止,我所尝试的: if(input.contains("am")) { //This because I have a string with other kind of items too (not only these interval of hours but names, etc) DateFormat df = new SimpleDat

我想将“上午9:00–晚上11:00”->“9:00–23:00”转换为“9:00–23:00”,我该怎么做?到目前为止,我所尝试的:

if(input.contains("am")) {  //This because I have a string with other kind of items too (not only these interval of hours but names, etc)

    DateFormat df = new SimpleDateFormat("h:mm a – h:mm a");
    DateFormat outputformat = new SimpleDateFormat("HH:mm - HH:mm");
    Date date = null;
    String output = null;
    date= df.parse(input);
    input = outputformat.format(date);
    System.out.println("Output: "+output);
}

但是输出是错误的,在23:00-23:00的例子中,因为它不能识别第一个和第二个小时

我也试过这样的方法:

     DateFormat df = new SimpleDateFormat("h:mm a" +" - "+ "h:mm a");
     DateFormat outputformat = new SimpleDateFormat("HH:mm"+" - "+ "HH:mm");
但我遇到了一个解析错误,然后尝试以下操作:

String dateToParse = "9:00 am – 11:00 pm";
        String splitDate[] = dateToParse.split("–");

        DateFormat df = new SimpleDateFormat("h:mm a");
        DateFormat outputformat = new SimpleDateFormat("HH:mm");
        Date date1 = null, date2 = null;
        String output1 = null, output2 = null;
        try {
            date1 = df.parse(splitDate[0].trim());
            date2 = df.parse(splitDate[1].trim());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        output1 = outputformat.format(date1);
        output2 = outputformat.format(date2);

        System.out.println("Output: " + output1 + " – " + output2);
试试这个:

String dateToParse = "9:00 am – 11:00 pm";
        String splitDate[] = dateToParse.split("–");

        DateFormat df = new SimpleDateFormat("h:mm a");
        DateFormat outputformat = new SimpleDateFormat("HH:mm");
        Date date1 = null, date2 = null;
        String output1 = null, output2 = null;
        try {
            date1 = df.parse(splitDate[0].trim());
            date2 = df.parse(splitDate[1].trim());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        output1 = outputformat.format(date1);
        output2 = outputformat.format(date2);

        System.out.println("Output: " + output1 + " – " + output2);
转向面向对象,使用java.time 不要将间隔从一种字符串格式转换为另一种字符串格式。设计一个
Interval
类来存储和操作时间间隔。我建议您包括一个方便的构造函数,它接受一个字符串和一个生成所需格式的
toString
方法

此外,我还建议您在时间工作中使用java.time,即现代java日期和时间API

public class Interval {

    private static final String middlePart = " – ";
    private static final DateTimeFormatter amPmFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("h:mm a")
            .toFormatter(Locale.ENGLISH);
    
    private LocalTime begin;
    private LocalTime end;
    
    public Interval(String intervalString) {
        String[] timeStrings = intervalString.split(middlePart);
        if (timeStrings.length != 2) {
            throw new IllegalArgumentException("Improper format");
        }
        begin = LocalTime.parse(timeStrings[0], amPmFormatter);
        end = LocalTime.parse(timeStrings[1], amPmFormatter);
    }
    
    @Override
    public String toString() {
        return "" + begin + middlePart + end;
    }
}
要尝试:

        Interval testInterval = new Interval("9:00 am – 11:00 pm");
        System.out.println(testInterval);
输出为:

09:00–23:00

你的代码出了什么问题?
Date
是用于间隔的完全错误的类。这门课设计拙劣,而且早已过时。
date
表示时间点,而不是一天中的某个时间点,当然也不是一天中两次的间隔

SimpleDataFormat
——一个臭名昭著的麻烦制造者——试图将您的字符串解析为时区中1970年1月1日的时间。它应该反对,因为那天的时间不能同时是上午9点和晚上11点——你在自相矛盾。但是不,
SimpleDateFormat
会给你一次这样的机会,闭上嘴假装一切正常。可能是想表现得好一点,但如果是这样的话,那就是完全被误解了

链接 解释如何使用java.time。

面向对象并使用java.time 不要将间隔从一种字符串格式转换为另一种字符串格式。设计一个
Interval
类来存储和操作时间间隔。我建议您包括一个方便的构造函数,它接受一个字符串和一个生成所需格式的
toString
方法

此外,我还建议您在时间工作中使用java.time,即现代java日期和时间API

public class Interval {

    private static final String middlePart = " – ";
    private static final DateTimeFormatter amPmFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("h:mm a")
            .toFormatter(Locale.ENGLISH);
    
    private LocalTime begin;
    private LocalTime end;
    
    public Interval(String intervalString) {
        String[] timeStrings = intervalString.split(middlePart);
        if (timeStrings.length != 2) {
            throw new IllegalArgumentException("Improper format");
        }
        begin = LocalTime.parse(timeStrings[0], amPmFormatter);
        end = LocalTime.parse(timeStrings[1], amPmFormatter);
    }
    
    @Override
    public String toString() {
        return "" + begin + middlePart + end;
    }
}
要尝试:

        Interval testInterval = new Interval("9:00 am – 11:00 pm");
        System.out.println(testInterval);
输出为:

09:00–23:00

你的代码出了什么问题?
Date
是用于间隔的完全错误的类。这门课设计拙劣,而且早已过时。
date
表示时间点,而不是一天中的某个时间点,当然也不是一天中两次的间隔

SimpleDataFormat
——一个臭名昭著的麻烦制造者——试图将您的字符串解析为时区中1970年1月1日的时间。它应该反对,因为那天的时间不能同时是上午9点和晚上11点——你在自相矛盾。但是不,
SimpleDateFormat
会给你一次这样的机会,闭上嘴假装一切正常。可能是想表现得好一点,但如果是这样的话,那就是完全被误解了

链接
解释如何使用java.time.

从外观上看,输出应该是
null
(因为您正在打印
output
,它只定义为
String output=null
),因此,请发布一些实际重现问题的内容。传递给
parse
方法的
string
变量是什么!?很抱歉,它不是date=df.parse(string);但是date=df.parse(输入);如果我在后面插入println,如果我正确地得到类型为“9:00am–11:00pm”的字符串列表。if使用当前代码正确运行输入和输出示例:I/System.out:input 9:00 am–11:00 pm I/System.out:output:23:00-23:00 I/System.out:input:8:00 am–5:00 pm I/System.out:output:17:00-17:00 I/System.out:input:4:00 am–12:00 pm I/System.out:output:12:00我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。请改为使用来自的
LocalTime
DateTimeFormatter
。感谢您的澄清。请将其添加到问题本身中,而不是添加到注释中,以便我们将所有内容都放在一个位置。从外观上看,输出应为
null
(因为您正在打印
output
,它仅定义为
String output=null
),因此,请发布一些实际重现问题的内容。传递给
parse
方法的
string
变量是什么!?很抱歉,它不是date=df.parse(string);但是date=df.parse(输入);如果我在后面插入println,如果我正确地得到类型为“9:00am–11:00pm”的字符串列表。if使用当前代码正确运行输入和输出示例:I/System.out:input 9:00 am–11:00 pm I/System.out:output:23:00-23:00 I/System.out:input:8:00 am–5:00 pm I/System.out:output:17:00-17:00 I/System.out:input:4:00 am–12:00 pm I/System.out:output:12:00我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。请改为使用来自的
LocalTime
DateTimeFormatter
。感谢您的澄清。请将其添加到问题本身而不是评论中,这样我们就可以将所有内容放在一个地方了。谢谢!它可以工作,但我有12pm:I/System.out:Input:9:00 am–11:00 pm I/System.out:Output:09:00–23:00 I/System.out:Input:9:00 am–11:00 pm I/System.out:Output:09:00–23:00 I/System.out:Input:9:00 am–11:00 pm I/System.out:Output:09:00–23:00 I/System.out:Input:8:00 am–5:00 I/System.out:输出:08:00–17:00 I/System.out:Input:4:00 am–12:00 pm I/System.out:Output:04:00–12:00正如您在最后两行中所看到的,12 pm被转换为12,但它是错误的,应该是00:00。上午12点改为12点