可以从String创建Java.time.LocalDate对象吗?

时间:2016-02-07 17:57:23

标签: java

我一直在尝试使用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;
    }
}

4 个答案:

答案 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.");

   }

}