如何在不使用弃用方法的情况下从Date对象获取年份?

时间:2016-05-09 19:49:27

标签: java date calendar deprecated

我已经获得了一项任务,我需要为汽车租赁公司创建一组接口和类。我正在忙于实现一个必须符合以下规范的LicenceNumber类:

  

许可证号码有三个组成部分。第一个组件是驱动程序名称的首字母与驱动程序的姓氏的首字母的串联。第二个组成部分是许可证颁发的年份。第三个组件是任意序列号。例如,1990年颁发给Mark Smith的许可证的许可证编号的字符串表示形式为MS-1990-10,其中10是序列号,带有首字母和年份,保证了其唯一性。许可证号码整体。

     

您应该使用java.util.Date类来表示日期。但是,您不能使用Date类的弃用方法。因此,例如,在测试类中使用java.util.Calendar来构建出生日期和许可证颁发日期。您可以假设默认时区和区域设置。 (注意,Java 1.8中引入的java.time包中现在有更好的类,但是使用类是很好的经验   写得不太好。)

到目前为止,我已经为LicenceNumber类实现了以下实现:

import java.util.Calendar;
import java.util.Date;

public class LicenceNumber {

private String licenceNo;

public LicenceNumber(Name driverName, Date issueDate){
    setLicenceNo(driverName, issueDate);
}

public String getLicenceNo() {
    return licenceNo;
}

public void setLicenceNo(Name driverName, Date issueDate) {
    String initials;
    initials = driverName.getForename().substring(0, 1) + driverName.getSurname().substring(0,1);
    System.out.println(initials);
    int issueYear = issueDate.getYear(); //Deprecated
}
}

我希望能够从issueDate只获得年份,但我能弄清楚如何做到的唯一方法是使用弃用的方法getYear()。这显然是违反标准的,所以任何人都可以了解如何在不使用弃用方法的情况下从Date对象获取Year吗?

非常感谢。

3 个答案:

答案 0 :(得分:3)

试试这个

日期日期=新日期();      LocalDate localDate = date.toInstant()。atZone(ZoneId.systemDefault())。toLocalDate();      int year = localDate.getYear();

这是修复

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
System.out.println(calendar.get(Calendar.YEAR));

将新日期替换为您希望获得年份的日期。

答案 1 :(得分:1)

我可以想到从Date对象获取年份的三种方法,但避免使用已弃用的方法。其中两种方法使用其他对象(CalendarSimpleDateFormat),第三种方法解析.toString()对象的Date(该方法已弃用)。 .toString()可能是特定于语言环境的,并且在其他语言环境中可能存在问题,但我将假设(着名的最后一句话)年份始终是4位数的唯一序列。人们还可以理解特定的语言环境并使用其他解析方法。例如,标准的美国/英语将年份放在最后(例如," Tue Mar 04 19:20:17 MST 2014"),可以使用.lastIndexOf(" ") .toString() }。

/**
 * Obtains the year by converting the date .toString() and
 * finding the year by a regular expression; works by assuming that
 * no matter what the locale, only the year will have 4 digits
 */
public static String getYearByRegEx(Date dte) throws IllegalArgumentException
{
    String year = "";

    if (dte == null) {
        throw new IllegalArgumentException("Null date!");
    }

    // match only a 4 digit year
    Pattern yearPat = Pattern.compile("^.*([\\d]{4}).*$");

    // convert the date to its String representation; could pass
    // this directly, but I prefer the intermediary variable for
    // potential debugging
    String localDate = dte.toString();

    // obtain a matcher, and then see if we have the expected value
    Matcher match = yearPat.matcher(localDate);
    if (match.matches() && match.groupCount() == 1) {
        year = match.group(1);
    }

    return year;
}


/**
 * Constructs a Calendar object, and then obtains the year
 * by using the Calendar.get(...) method for the year.
 */
public static String getYearFromCalendar(Date dte) throws IllegalArgumentException
{
    String year = "";

    if (dte == null) {
        throw new IllegalArgumentException("Null date!");
    }

    // get a Calendar
    Calendar cal = Calendar.getInstance();

    // set the Calendar to the specific date; the reason why
    // Calendar is deprecated is this mutability
    cal.setTime(dte);

    // get the year using the .get method, and convert to a String
    year = String.valueOf(cal.get(Calendar.YEAR));

    return year;
}


/**
 * Uses the SimpleDateFormat with a format for only a year.
 */
public static String getYearByFormatting(Date dte)
        throws IllegalArgumentException
{
    String year = "";

    if (dte == null) {
        throw new IllegalArgumentException("Null date!");
    }

    // set a format only for the year
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy");

    // format the date; the result is the year
    year = sdf.format(dte);

    return year;        
}


public static void main(String[] args)
{
    Calendar cal = Calendar.getInstance();
    cal.set(2014, 
            Calendar.MARCH,
            04);

    Date dte = cal.getTime();

    System.out.println("byRegex: "+ getYearByRegEx(dte));
    System.out.println("from Calendar: "+ getYearFromCalendar(dte));
    System.out.println("from format: " + getYearByFormatting(dte));
}

所有三种方法都根据测试输入返回预期输出。

答案 2 :(得分:0)

查看https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html及相关课程。这可以产生一个字符串,只包含给定'Date'中的“year”字段。