如何将整数 YYYYmmDD 转换为 java 中的 YYYY/mm/DD

How to convert integer YYYYmmDD into YYYY/mm/DD in java

我正在尝试处理来自气象站的数据。我只想处理和打印(目前)从 2000/01/01 到今天 2019/12/12 的每一天的最低和最高温度。气象站给我一个整数 yyyymmdd 的日期,比如 20191212 或 20030317。我将它与最低和最高温度一起存储在一个整数数组中,大约 21000 行长......我希望日期显示在 yyyy/mm/dd,例如 2019/12/12 或 2003/03/17。我该怎么做呢?

这是我的代码

import java.io.*;

public class Main {
    public static void main(String args[]) {
        int rowAmount = 7152;   //the amount of rows in the document
        int[] temperatures = new int[rowAmount*3];  //makes an array 3 times the size of rowAmount, to fit date, min temp and max temp.
        try {   
            BufferedReader br = new BufferedReader(new FileReader("D:\20002019minmaxtempbilt.txt")); // Makes the filereader

            String fileRead = br.readLine(); // reads first like
            int counter = 0;    //sets a counter
            while (fileRead != null) { // loops until the file ends.
                String[] tokenize = fileRead.split(","); //splits the line in 3 segements, date, min temp and max temp. And stores them in following variables
                int tempDate = Integer.parseInt(tokenize[0]);
                int tempMin = Integer.parseInt(tokenize[1]);
                int tempMax = Integer.parseInt(tokenize[2]);
                //adds the values to the array
                temperatures[counter] = tempDate;
                counter++;
                temperatures[counter] = tempMin;
                counter++;
                temperatures[counter] = tempMax;
            }
            // close file stream
            br.close();
        }
        catch (FileNotFoundException fnfe)
        {
            System.out.println("file not found");
        }

        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }

        // Displays the entire array, formatted by date neatly, hopefully.

        for(int i = 0; i<rowAmount; i =+ 3) {
            int tempDate = temperatures[i];
            int tempMin = temperatures[i+1];
            int tempMax = temperatures[i+2];
            drawLine(tempDate, tempMin, tempMax);
        }


    }

    public static void drawLine(int tempDate, int tempMin, int tempMax) {
        /*This is where I get stuck. I need to convert tempDate from an int yyyymmdd to either
          3 separate integers representing year, month and day; or I need to convert it to a 
          string that can be printed out yyyy/mm/dd.*/

        System.out.printf("");

    }
}

我建议使用 DateFormat object, taking advantage of the parse(String) and format(Date) 方法。

另一种方式:如果表示日期的整数值存储在一个名为 date 的 int 中(示例值:20191212),则

  int day = date % 100;
  int month = (date/ 100) % 100;
  int year = date / 10000;

然后您可以使用 Formatter 来格式化您想要的字符串输出。

一个问题是整数 20191212 实际上并不代表日期。

我建议不要将 tempDate 转换为整数并将其保留为字符串。

编辑

这是一个使用 Java 8 time package classes: LocalDate, DateTimeFormatter, and DateTimeFormatterBuilder:

的例子

软件包 Whosebug;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

public class ParseStringDate {

    public static void main(String... args) {

        String dateString = "20191231";

        DateTimeFormatter dateTimeFormatterParser = DateTimeFormatter.ofPattern("yyyyMMdd");

        LocalDate localDate = LocalDate.parse(dateString, dateTimeFormatterParser);

        System.out.println(localDate);

        DateTimeFormatter dateTimeFormatterPrinter = DateTimeFormatter.ofPattern("yyyy/MM/dd");

        System.out.println(localDate.format(dateTimeFormatterPrinter));

        dateTimeFormatterPrinter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy")
                .appendLiteral("/")
                .appendPattern("MM")
                .appendLiteral("/")
                .appendPattern("dd").toFormatter();

        System.out.println(localDate.format(dateTimeFormatterPrinter));
    }
}

这里是一个使用 SimpleDateFormat:

的例子
package Whosebug;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormattingFromString {

    public static void main(String... args) throws Exception {

        String tempDate = "20191212";

        SimpleDateFormat sdf1 = new SimpleDateFormat("YYYYmmdd");

        Date date = sdf1.parse(tempDate);

        // Now format the above date as needed...
        SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY/mm/dd");

        System.out.println(sdf2.format(date));
    }
}

正如评论中所指出的,SimpleDateFormatDate 类 并不是很好用。它们是可变的,因此不是线程安全的。新的 java.time 包 类 是不可变的,因此是线程安全的。新的 类 也更容易进行日期数学运算和比较。

由于您的日期是一个字符串开头,我认为没有理由先将其转换为整数。使用更新的 java.time 包,您可以使用一个格式化程序将 String 转换为 LocalDate,然后使用另一个格式化程序以正确的格式转换回 String,

DateTimeFormatter inFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate date = LocalDate.parse(tokenize[0], inFormatter);

DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String outStr = outFormatter.format(date);

由于 DateTimeFormatter 的初始化成本很高,我建议您在读取文件的循环之前创建它们。