有没有直接的方法将日期设置为变量,而作为输入呢?我的意思是,在设计时我不知道日期,应该由用户提供。我尝试了下面的代码,但它不起作用:
Calendar myDate = new GregorianCalendar(int year, int month, int day);
有没有直接的方法将日期设置为变量,而作为输入呢?我的意思是,在设计时我不知道日期,应该由用户提供。我尝试了下面的代码,但它不起作用:
Calendar myDate = new GregorianCalendar(int year, int month, int day);
LocalDate.of( 2026 , 1 , 23 ) // Pass: ( year , month , day )
一些其他答案在展示如何从用户那里获取输入时是正确的,但使用麻烦的旧日期时间类,这些类现已被java.time类所取代。
LocalDate
对于仅包含日期而不包含时间和时区的值,请使用LocalDate
类。
LocalDate ld = LocalDate.of( 2026 , 1 , 23 );
根据此处讨论,将您的输入字符串解析为整数:如何在Java中将String转换为int?
int y = Integer.parseInt( yearInput );
int m = Integer.parseInt( monthInput ); // 1-12 for January-December.
int d = Integer.parseInt( dayInput );
LocalDate ld = LocalDate.of( y , m , d );
java.time框架已内置于Java 8及以后版本。这些类取代了老旧的遗留日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
等。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
如何获取java.time类?
ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能未来添加的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
以及更多。
// To take the input
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the Date ");
String date = scanner.next();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
Date date2=null;
try {
//Parsing the String
date2 = dateFormat.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(date2);
java.util.Date
,java.util.Calendar
和 java.text.SimpleDateFormat
)已被标记为遗留系统,并被内置于 Java 8 和 Java 9 的 java.time 类所取代。详见Oracle官方教程。 - Basil Bourque我建议您在处理日期时使用现代的 Java 日期和时间 API,即 java.time。其他答案中使用的 Date
和 SimpleDateFormat
类设计不佳且过时,不要使用它们。
此外,我建议用户使用特定于其语言环境的短格式输入日期。为此,我首先声明了一些常量:
private static final Locale defaultFormattingLocale
= Locale.getDefault(Locale.Category.FORMAT);
private static final String defaultDateFormat = DateTimeFormatterBuilder
.getLocalizedDateTimePattern(FormatStyle.SHORT, null,
IsoChronology.INSTANCE, defaultFormattingLocale);
private static final DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern(defaultDateFormat, defaultFormattingLocale);
Scanner inputScanner = new Scanner(System.in);
LocalDate sampleDate
= Year.now().minusYears(1).atMonth(Month.NOVEMBER).atDay(26);
System.out.println("Enter date in " + defaultDateFormat
+ " format, for example " + sampleDate.format(dateFormatter));
String dateString = inputScanner.nextLine();
try {
LocalDate inputDate = LocalDate.parse(dateString, dateFormatter);
System.out.println("Date entered was " + inputDate);
} catch (DateTimeParseException dtpe) {
System.out.println("Invalid date: " + dateString);
}
美国本地化的示例会话:
Enter date in M/d/yy format, for example 11/26/20
2/9/21
Date entered was 2021-02-09
丹麦语环境下的示例会话:
Enter date in dd/MM/y format, for example 26/11/2020
9/februar/2021
Invalid date: 9/februar/2021
dateFormatter
一起使用的 Locale
不一定要与获得 defaultDateFormat
的 Locale
相同。例如,String format = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.FULL, null, IsoChronology.INSTANCE, Locale.FRANCE); LocalDate now = LocalDate.now(); System.out.println(now.format(DateTimeFormatter.ofPattern(format, Locale.ENGLISH))); System.out.println(now.format(DateTimeFormatter.ofPattern(format, Locale.FRANCE)));
- Arvind Kumar AvinashSimpleDateFormat dateInput = new SimpleDateFormat("yyyy-MM-dd");
Scanner input = new Scanner(System.in);
String strDate = input.nextLine();
try
{
Date date = dateInput.parse(strDate);
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
}
catch (ParseException e)
{
System.out.println("Parce Exception");
}
SimpleDateFormat
类。至少不要将其作为第一选择。而且不要没有任何保留地使用它。我们在 java.time
, 现代 Java 日期和时间 API, 和它的 DateTimeFormatter
中有更好的选择。 - Ole V.V. ZoneId defaultZoneId = ZoneId.systemDefault();
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the DOB: ");
String dobString = scanner.nextLine();
LocalDate dobLocal = LocalDate.parse(dobString);
Date dob = Date.from(dobLocal.atStartOfDay(defaultZoneId).toInstant());
System.out.println(dob);
Scanner scanner = new Scanner(System.in);
String str[] = {"year", "month", "day" };
String date = "";
for(int i=0; i<3; i++) {
System.out.println("Enter " + str[i] + ": ");
date = date + scanner.next() + "/";
}
date = date.substring(0, date.length()-1);
System.out.println("date: "+ date);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date parsedDate = null;
try {
parsedDate = dateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return parsedDate;
String format = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.FULL, null, IsoChronology.INSTANCE, Locale.FRANCE);
LocalDate now = LocalDate.now();
System.out.println(
now.format(DateTimeFormatter.ofPattern(format, Locale.ENGLISH)));
System.out.println(
now.format(DateTimeFormatter.ofPattern(format, Locale.FRANCE)));
对于美国人,请确保用US替换FRANCE,英国人使用UK等。以下是当前使用的国家列表。 https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html
此外,请务必单独导入所有必要的包,因为time*将无法工作。 因此,这些基本上是
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;
import java.time.format.FormatStyle;
import java.time.chrono.IsoChronology;
这个可以运行,我试过了!
package javaapplication2;
//@author Ibrahim Yesilay
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class JavaApplication2 {
public static void main(String[] args) throws ParseException {
Scanner giris = new Scanner(System.in);
System.out.println("gün:");
int d = giris.nextInt();
System.out.println("ay:");
int m = giris.nextInt();
System.out.println("yil:");
int y = giris.nextInt();
String tarih;
tarih = Integer.toString(d) + "/" + Integer.toString(m) + "/" + Integer.toString(y);
System.out.println("Tarih : " + tarih);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date girilentarih = null;
girilentarih = dateFormat.parse(tarih);
System.out.println(dateFormat.format(girilentarih));
}
}
这应该可以正常工作,你还可以使用setlenient函数验证日期-
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
public class Datinput {
public static void main(String args[]) {
int n;
ArrayList<String> al = new ArrayList<String>();
Scanner in = new Scanner(System.in);
n = in.nextInt();
String da[] = new String[n];
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setLenient(false);
Date date[] = new Date[n];
in.nextLine();
for (int i = 0; i < da.length; i++) {
da[i] = in.nextLine();
}
for (int i = 0; i < da.length; i++) {
try {
date[i] = sdf.parse(da[i]);
} catch (ParseException e) {
e.printStackTrace();
}
}
in.close();
}
}
GregorianCalendar
类已被标记为过时的类,Java 8 及更高版本中应使用ZonedDateTime
替代。如果您只需要年月日而不需要时间,则可以使用LocalDate
。例如,LocalDate.of(2018, 1, 23)
表示2018年1月23日。 - Basil Bourque