为了账号安全,请及时绑定邮箱和手机立即绑定

无效的简单日期格式 + InputMisMatch

无效的简单日期格式 + InputMisMatch

慕容森 2021-12-22 17:55:35
我正在创建一个大数组,其中每个元素都是对象 Temperature(String dayMonthYear, String hour, double degree, double speed)然后我取 dayMonthYear 和 hour 并尝试将其解析为一个日期,该日期与度数和速度(风速)一起存储为一个实例。下面是制作数组的代码,86793是文件中的行数public Temperature[] readTemperatures(String filename) {    Temperature[] temp = new Temperature[86793];    File f = new File(filename);    Scanner scan;    int i = 0;    try {        scan = new Scanner(f);        while(scan.hasNextLine()) {            String dayMonthYear = scan.next();            String hour = scan.next();            double degrees = scan.nextDouble();            double speed = scan.nextDouble();            temp[i] = new Temperature(dayMonthYear, hour, degrees, speed);            i++;        }    } catch (FileNotFoundException e) {        e.printStackTrace();    }    return temp;}下面是承包商和日期解析器public Temperature(String dayMonthYear, String hour, double degrees, double speed) {    Date date = createDate(dayMonthYear, hour);    this.date = date;    this.temperature = degrees;    this.windspeed = speed;}// Method to create datepublic static Date createDate(String date, String hour) {    Date returnDate = null;    SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm");    String stringDate = date + " " + hour;    try {        returnDate = formatter.parse(stringDate);    } catch (Exception e) {        System.out.println("Invalid format: " + stringDate);    }    return returnDate;}下面是我尝试输入的数据看起来像 1-Jan-2006 0:00 41.4 22006 年 1 月 1 日 1:00 39.8 1.9[我尝试将输入更改为类似2006 年 1 月 1 日 03:00 41.5 1.7但无济于事]我得到的错误是Invalid format: 01-Jan-2006 00:00Exception in thread "main" java.util.InputMismatchExceptionat java.base/java.util.Scanner.throwFor(Scanner.java:939)at java.base/java.util.Scanner.next(Scanner.java:1594)at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)at P10.readTemperatures(P10.java:22)at P10.main(P10.java:61)
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

这个“可能”或“可能不”与您遇到的问题直接相关,但它应该作为警告......


nb 这也可能是我的系统配置方式,但让我感到意外


说明MMM符的工作方式似乎发生了变化(至少在 Java 10 中)。例如,如果我做类似...


Calendar cal = Calendar.getInstance();

cal.set(Calendar.MONTH, Calendar.JANUARY);

cal.set(Calendar.DATE, 1);

cal.set(Calendar.YEAR, 2066);


SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");

System.out.println(sdf.format(cal.getTime()));

它将打印01-Jan.-2066... 注意.在月底。


这可能是一个很好的机会,摆脱本质上已弃用的 API 并采用自 Java 8(或 3/10 向后移植)以来可用的新日期/时间类


因此,相反,您可以执行以下操作:


String date = "01-Jan-2006";

String hour = "00:00";


LocalDate ld = LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.UK));

LocalTime lt = LocalTime.parse(hour, DateTimeFormatter.ISO_LOCAL_TIME.localizedBy(Locale.UK));


LocalDateTime ldt = LocalDateTime.of(ld, lt);


System.out.println(ldt);

这将打印 2006-01-01T00:00


请注意,有人会指出您“不需要”进行两个单独的对话,并且您“可以”连接date/hour并一步完成,您“可以”这样做,但是由于无论如何您都将值分开了,它分开对待它们才有意义


查看完整回答
反对 回复 2021-12-22
?
慕斯王

TA贡献1864条经验 获得超2个赞

使用 Scanner 的 useLocale(Locale.US) 函数为扫描仪设置正确的区域设置。您可能正在使用十进制分隔符不是“.”的语言环境。但其他一些字符,如逗号。


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信