我一直在尝试使用date.format(DateTimeFormatter formatter)方法来格式化日期字符串列表,其中' date'例如,是一个java.time.LocalDate对象。问题是,我找不到从字符串创建Year对象的直接方法。例如,如果我有字符串yearString =" 90"。我想创建一个等于此值的Year对象,然后使用format方法输出yearStringNew =" 1990"。我最接近公共构造函数的是now()函数,它返回当前时间。
我还研究了创建一个Calendar对象,然后在那里创建一个可格式化的日期对象,但我只能创建一个Java.util.Date对象 - 而不是Java.time包中的一个对象,然后可以理想情况下,格式化函数格式化。我在这里错过了什么吗?
仅供我参考Java 8 SDK javadoc https://docs.oracle.com/javase/8/docs/api/
感谢您的时间。
编辑:根据其他用户的请求,我在下面发布了我的代码;这是我最接近完成我正在寻找的东西:
//Module 3:
//Format Date Segments
package challenge245E;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class TestClass3 {
public static void main(String[] args) throws ParseException {
DateFormatter dateFormatter = new DateFormatter();
String myGroupedSlices [][] =
{
{"1990", "12", "06"},
{"12","6", "90"}
};
dateFormatter.formatDates(myGroupedSlices);
}
}
class DateFormatter {
public Date[][] formatDates(String[][] groupedDates) throws ParseException {
Date[][] formattedDates = new Date[groupedDates.length][3];
DateFormat yearFormat = new SimpleDateFormat("YYYY");
DateFormat monthFormat = new SimpleDateFormat("MM");
DateFormat dayFormat = new SimpleDateFormat("dd");
//iterate through each groupedSlices array
for (int i=0; i<groupedDates.length;i++) {
//Conditions
if (groupedDates[i][0].length()<3) {
//MDDYY format: if date[0].length < 3
//Re-arrange into YDM order
String m = groupedDates[i][0];
String y = groupedDates[i][2];
groupedDates[i][0] = y;
groupedDates[i][2] = m;
//convert dates to correct format
formattedDates[i][0] = yearFormat.parse(groupedDates[i][0]);
formattedDates[i][1] = monthFormat.parse(groupedDates[i][1]);
formattedDates[i][2] = dayFormat.parse(groupedDates[i][2]);
//testing if block
System.out.println("MDY Order: " + Arrays.toString(formattedDates[i]));
}
if (groupedDates[i][0].length()>3) {
//YYYYMMDD format: if date[0].length > 3
//convert dates to correct format
formattedDates[i][0] = yearFormat.parse(groupedDates[i][0]);
formattedDates[i][1] = monthFormat.parse(groupedDates[i][1]);
formattedDates[i][2] = dayFormat.parse(groupedDates[i][2]);
//testing if block
System.out.println("YMD Order: " + Arrays.toString(formattedDates[i]));
}
}
return formattedDates;
}
}
答案 0 :(得分:2)
如果我理解您的要求,请查看LocalDate.parse()方法。
示例:
LocalDate date = LocalDate.parse("1990-01-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
int year = date.getYear(); // 1990
答案 1 :(得分:1)
很高兴看到你使用java.time框架而不是麻烦的旧日期时间类。旧的java.util.Date/.Calendar类已被新框架取代。
DateTimeFormatter
类将任何两位数的年份解析为2000年代。来自班级doc:
如果字母数为2 ......将使用2000的基值进行解析,从而产生2000到2099(含)范围内的一年。
要覆盖此行为,请this Answer查看assylias。但在你的情况下,这个问题可能没有实际意义。您已经隔离了单独的年,月和日期值。所以他们不需要一起解析。
我建议您将每个字符串转换为整数。对于这一年,如果少于100,则添加1900。
String inputYear = "90";
String inputMonth = "12";
String inputDayOfMonth = "6";
int year = Integer.parseInt( inputYear );
int month = Integer.parseInt( inputMonth );
int dayOfMonth = Integer.parseInt( inputDayOfMonth );
if( year < 100 ) { // If two-digit year, assume the 1900s century. Even better: Never generate two-digit year text!
year = ( year + 1900 );
}
LocalDate localDate = LocalDate.of( year , month , dayOfMonth );
答案 2 :(得分:0)
创建GregorianCalendar类的实例,在该日历中设置日期,然后使用方法toZonedDateTime()。这将为您提供ZonedDateTime实例。从形式上你可以使用方法LocalDate.from(TemporalAccessor temporal)方法来获取你的LocalDate。在这里看起来如何:
//....
GregorianCalendar calendar = new GregorianCalendar();
// Set the deasired date in your calendar
LocalDate localDate = LocalDate.from(calendar.toZonedDateTime());
//...
答案 3 :(得分:0)
导入java.time.LocalDate;
公共课程DaysTilNextMonth {
public static void main(String[] args) {
//create an object for LocalDate class
LocalDate date = LocalDate.now();
//get today's day
int today = date.getDayOfMonth();
//get number of days in the current month
int numOfDaysInMonth = date.lengthOfMonth();
//compute the days left for next month
int dayForNextMonth = numOfDaysInMonth - today;
//display the result
System.out.println("The next month is: " + date.plusMonths(7).getMonth());
System.out.println("We have " + dayForNextMonth + " days left until first day of next month.");
}
}