Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 从字符串解析日期/时间?_Java_String_Parsing_Date_Time - Fatal编程技术网

Java 从字符串解析日期/时间?

Java 从字符串解析日期/时间?,java,string,parsing,date,time,Java,String,Parsing,Date,Time,我试图创建一个程序来解析字符串中有意义的日期和时间。我希望能够提供以下类型的输入,并创建日期/时间对象: 5 o'clock 5 p.m. 5 a.m. 5 530 530 a.m. 530 p.m. Tuesday at [insert any above string here] the 30th at [same as above] May 12th at [same as above] today at [same as above] tomorrow at [same as above

我试图创建一个程序来解析字符串中有意义的日期和时间。我希望能够提供以下类型的输入,并创建日期/时间对象:

5 o'clock
5 p.m.
5 a.m.
5
530
530 a.m.
530 p.m.
Tuesday at [insert any above string here]
the 30th at [same as above]
May 12th at [same as above]
today at [same as above]
tomorrow at [same as above]
任何不包含日期的字符串都可以假定为今天,任何没有AM/PM名称的时间都可以假定为发生在上午9点到晚上8:59之间。 在编写了这部分代码后,我很快意识到这是多么混乱:

private void createEvent(String phrase) {
    int hour;
    int day = 0;
    String dayOfWeek = "";

    if (phrase.contains("o'clock")) {
        hour = Integer.parseInt(phrase.substring(phrase.indexOf("o'clock")-3, phrase.indexOf("o'clock")-1).trim());
        out.write(""+hour);
    }

    if (phrase.contains("tomorrow"))
        day = (Calendar.DAY_OF_WEEK % 7)+1;

    if (phrase.contains("sunday") || day == 1) {
        dayOfWeek = "Sunday"; day = 1; }
    else if (phrase.contains("monday") || day == 2) {
        dayOfWeek = "Monday"; day = 2; }
    else if (phrase.contains("tuesday") || day == 3) {
        dayOfWeek = "Tuesday"; day = 3; }
    else if (phrase.contains("wednesday") || day == 4) {
        dayOfWeek = "Wednesday"; day = 4; }
    else if (phrase.contains("thursday") || day == 5) {
        dayOfWeek = "Thursday"; day = 5; }
    else if (phrase.contains("friday") || day == 6) {
        dayOfWeek = "Friday"; day = 6; }
    else if (phrase.contains("saturday") || day == 7) {
        dayOfWeek = "Saturday"; day = 7; }
    else {
        dayOfWeek = "Today"; day = 0; }     
}

有人能提供一些指导吗?

您可以使用DateFormat

String now = new Date().toString();
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Date date = format.parse(now);
也许你可以提前构建一些格式,然后比较解析的日期


检查此处的教程:

您可以使用DateFormat

String now = new Date().toString();
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Date date = format.parse(now);
也许你可以提前构建一些格式,然后比较解析的日期


查看此处的教程:

将问题分解为可管理的部分

首先,我将提供一种方法,您可以根据需要添加新的格式化程序

我也会尝试重新使用现有的代码。对于你的问题来说,时间是一个相当一致的方面

这将使我想到提供某种集中格式工厂的概念(使管理更容易),但将单个需求分解为更小的可管理块

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class CustomDateFormatter {

    public static void main(String[] args) {
        new CustomDateFormatter();
    }

    public CustomDateFormatter() {

        String values[] = new String[]{
            "5 o'clock",
            "5 p.m.",
            "5 a.m.",
            "5",
            "530",
            "530 a.m.",
            "530 p.m.",};

        for (String value : values) {
            System.out.println(value + " = " + CustomFormatFactory.format(value));
        }
    }

    public static class CustomFormatFactory {

        private static List<CustomFormat> formatters = new ArrayList<>();

        public static Date format(String value) {
            Date date = null;
            for (CustomFormat format : formatters) {
                if (format.canFormat(value)) {
                    date = format.format(value);
                    if (date != null) {
                        break;
                    }
                }
            }
            return date;
        }

        protected static boolean formatTime(String value, Calendar cal) {
            boolean formatted = false;
            if (Character.isDigit(value.charAt(0))) {
                formatted = true;
                StringBuilder timePart = new StringBuilder(4);
                int index = 0;
                while (index < value.length() && Character.isDigit(value.charAt(index))) {
                    timePart.append(value.charAt(index));
                    index++;
                }

                int hour = 0;
                int min = 0;
                if (timePart.length() < 3) {
                    hour = Integer.parseInt(timePart.toString());
                } else {
                    hour = Integer.parseInt(timePart.substring(0, timePart.length() - 2));
                    min = Integer.parseInt(timePart.substring(timePart.length() - 2, 3));
                }

                cal.set(Calendar.HOUR_OF_DAY, hour);
                cal.set(Calendar.MINUTE, min);
                cal.set(Calendar.MILLISECOND, 0);

                String sufix = value.substring(timePart.length()).trim();
                if ("p.m.".equalsIgnoreCase(sufix) || "pm".equalsIgnoreCase(sufix)) {
                    cal.add(Calendar.HOUR, 12);
                }
            }
            return formatted;
        }

        static {
            formatters.add(new SimpleTimeFormat());
        }
    }

    public static interface CustomFormat {

        public boolean canFormat(String value);

        public Date format(String value);
    }

    public static class SimpleTimeFormat implements CustomFormat {

        @Override
        public boolean canFormat(String value) {
            return format(value) != null;
        }

        @Override
        public Date format(String value) {
            Date date = null;
            Calendar cal = Calendar.getInstance();
            if (CustomFormatFactory.formatTime(value, cal)) {
                date = cal.getTime();
            }
            return date;
        }
    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.List;
公共类CustomDateFormatter{
公共静态void main(字符串[]args){
新的CustomDateFormatter();
}
公共CustomDateFormatter(){
字符串值[]=新字符串[]{
“5点钟”,
“下午5点”,
“早上5点”,
"5",
"530",
“早上530点”,
“下午530时”,};
for(字符串值:值){
System.out.println(值+“=”+CustomFormatFactory.format(值));
}
}
公共静态类CustomFormatFactory{
私有静态列表格式化程序=新的ArrayList();
公共静态日期格式(字符串值){
日期=空;
用于(自定义格式:格式化程序){
if(format.canFormat(value)){
日期=格式。格式(值);
如果(日期!=null){
打破
}
}
}
返回日期;
}
受保护的静态布尔格式时间(字符串值、日历校准){
布尔格式=假;
if(Character.isDigit(value.charAt(0))){
格式化=真;
StringBuilder timePart=新StringBuilder(4);
int指数=0;
while(index
对于扩展的日期格式,我将提取日期部分,基于日期构建一个
日历
,将时间分区提取为一个单独的
字符串
,并使用
CustomFormatFactory.formatTime
方法来格式化时间,这样就省去了每次重新编码的麻烦


同样,日期格式化程序可以简单地在内部具有时间格式化程序的实例,或者您可以将工厂设置为具有多个格式化方法,其中一个方法接受时间值并循环使用可用的时间格式化程序。。。这将是我个人的选择;)

将您的问题分解为可管理的部分

首先,我将提供一种方法,您可以根据需要添加新的格式化程序

我也会尝试重新使用现有的代码。对于你的问题来说,时间是一个相当一致的方面

这将使我想到提供某种集中格式工厂的概念(使管理更容易),但将单个需求分解为更小的可管理块

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class CustomDateFormatter {

    public static void main(String[] args) {
        new CustomDateFormatter();
    }

    public CustomDateFormatter() {

        String values[] = new String[]{
            "5 o'clock",
            "5 p.m.",
            "5 a.m.",
            "5",
            "530",
            "530 a.m.",
            "530 p.m.",};

        for (String value : values) {
            System.out.println(value + " = " + CustomFormatFactory.format(value));
        }
    }

    public static class CustomFormatFactory {

        private static List<CustomFormat> formatters = new ArrayList<>();

        public static Date format(String value) {
            Date date = null;
            for (CustomFormat format : formatters) {
                if (format.canFormat(value)) {
                    date = format.format(value);
                    if (date != null) {
                        break;
                    }
                }
            }
            return date;
        }

        protected static boolean formatTime(String value, Calendar cal) {
            boolean formatted = false;
            if (Character.isDigit(value.charAt(0))) {
                formatted = true;
                StringBuilder timePart = new StringBuilder(4);
                int index = 0;
                while (index < value.length() && Character.isDigit(value.charAt(index))) {
                    timePart.append(value.charAt(index));
                    index++;
                }

                int hour = 0;
                int min = 0;
                if (timePart.length() < 3) {
                    hour = Integer.parseInt(timePart.toString());
                } else {
                    hour = Integer.parseInt(timePart.substring(0, timePart.length() - 2));
                    min = Integer.parseInt(timePart.substring(timePart.length() - 2, 3));
                }

                cal.set(Calendar.HOUR_OF_DAY, hour);
                cal.set(Calendar.MINUTE, min);
                cal.set(Calendar.MILLISECOND, 0);

                String sufix = value.substring(timePart.length()).trim();
                if ("p.m.".equalsIgnoreCase(sufix) || "pm".equalsIgnoreCase(sufix)) {
                    cal.add(Calendar.HOUR, 12);
                }
            }
            return formatted;
        }

        static {
            formatters.add(new SimpleTimeFormat());
        }
    }

    public static interface CustomFormat {

        public boolean canFormat(String value);

        public Date format(String value);
    }

    public static class SimpleTimeFormat implements CustomFormat {

        @Override
        public boolean canFormat(String value) {
            return format(value) != null;
        }

        @Override
        public Date format(String value) {
            Date date = null;
            Calendar cal = Calendar.getInstance();
            if (CustomFormatFactory.formatTime(value, cal)) {
                date = cal.getTime();
            }
            return date;
        }
    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.List;
公共类CustomDateFormatter{
公共静态void main(字符串[]args){
新的CustomDateFormatter();
}
公共CustomDateFormatter(){
字符串值[]=新字符串[]{
“5点钟”,
“下午5点”,
“早上5点”,
"5",
"530",
“早上530点”,
“下午530时”,};
对于(字符串值: