如何将整数 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));
}
}
正如评论中所指出的,SimpleDateFormat
和 Date
类 并不是很好用。它们是可变的,因此不是线程安全的。新的 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 的初始化成本很高,我建议您在读取文件的循环之前创建它们。
我正在尝试处理来自气象站的数据。我只想处理和打印(目前)从 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));
}
}
正如评论中所指出的,SimpleDateFormat
和 Date
类 并不是很好用。它们是可变的,因此不是线程安全的。新的 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 的初始化成本很高,我建议您在读取文件的循环之前创建它们。