#java #nsdateformatter #jodatime
#java #nsdateformatter #jodatime
Вопрос:
Я пытаюсь вычислить текущий возраст пользователя.. но использование формата, который я хотел бы использовать, вызвало у меня некоторые проблемы.
Я мог бы просто задать отдельно год, месяц и день, но скорее предпочитаю (мм / дд / гггг)
//Need help turning (mm/dd/yyyy) that the user inputs into:
//yyyy;
//mm;
// dd;
package org.joda.time;
import java.util.Calendar;
import java.util.GregorianCalendar;//needed for leap year
import java.util.Scanner;
import java.io.*;
public class AgeCalculation{
public static void main(String[] args) throws IOException{
int day = 1, month = 0, year = 1, ageYears, ageMonths, ageDays;
Scanner myScanner = new Scanner(System.in);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Calendar cd = Calendar.getInstance();
try{
System.out.print("Enter your Date of Birth.(mm/dd/yyyy): ");
Dob = myScanner.nextLine() ;
// how to get year , month and date from (mm/dd/yyyy) format?
year = ;
if(year > cd.get(Calendar.YEAR)){
System.out.print("Invalid date of birth.");
System.exit(0);
}
month =
if(month < 1 || month > 12){
System.out.print("Please enter monthe between 1 to 12.");
System.exit(0);
}
else{
month--;
if(year == cd.get(Calendar.YEAR)){
if(month > cd.get(Calendar.MONTH)){
System.out.print("Invalid month!");
System.exit(0);
}
}
}
if(month == 0 || month == 2 || month == 4 || month == 6 || month == 7 ||
month == 9 || month == 11){
if(day > 31 || day < 1){
//leap year data below
System.out.print("Please enter day between 1 to 31.");
System.exit(0);
}
}
else if(month == 3 || month == 5 || month == 8 || month == 10){
if(day > 30 || day < 1){
System.out.print("Please enter day between 1 to 30.");
System.exit(0);
}
}
else{
if(new GregorianCalendar().isLeapYear(year)){
if(day < 1 || day > 29){
System.out.print("Please enter day between 1 to 29.");
System.exit(0);
}
}
else if(day < 1 || day > 28){
System.out.print("Please enter day between 1 to 28.");
System.exit(0);
}
}
if(year == cd.get(Calendar.YEAR)){
if(month == cd.get(Calendar.MONTH)){
if(day > cd.get(Calendar.DAY_OF_MONTH)){
System.out.print("Invalid date!");
System.exit(0);
}
}
}
}
catch(NumberFormatException ne){
System.out.print(ne.getMessage() " is not a legal entry!");
System.out.print("Please enter number.");
System.exit(0);
}
Calendar bd = new GregorianCalendar(year, month, day);
ageYears = cd.get(Calendar.YEAR) - bd.get(Calendar.YEAR);
if(cd.before(new GregorianCalendar(cd.get(Calendar.YEAR), month, day))){
ageYears--;
ageMonths = (12 - (bd.get(Calendar.MONTH) 1)) (bd.get(Calendar.MONTH));
if(day > cd.get(Calendar.DAY_OF_MONTH)){
ageDays = day - cd.get(Calendar.DAY_OF_MONTH);
}
else if(day < cd.get(Calendar.DAY_OF_MONTH)){
ageDays = cd.get(Calendar.DAY_OF_MONTH) - day;
}
else{
ageDays = 0;
}
}
else if(cd.after(new GregorianCalendar(cd.get(Calendar.YEAR), month, day))){
ageMonths = (cd.get(Calendar.MONTH) - (bd.get(Calendar.MONTH)));
if(day > cd.get(Calendar.DAY_OF_MONTH))
ageDays = day - cd.get(Calendar.DAY_OF_MONTH) - day;
else if(day < cd.get(Calendar.DAY_OF_MONTH)){
ageDays = cd.get(Calendar.DAY_OF_MONTH) - day;
}
else
ageDays = 0;
}
else{
ageYears = cd.get(Calendar.YEAR) - bd.get(Calendar.YEAR);
ageMonths = 0;
ageDays = 0;
}
System.out.print("Age of the person : " ageYears " year, " ageMonths
" months and " ageDays " days.");
}
}
Комментарии:
1. Просто позвольте пользователю ввести дату в указанном формате и проанализировать эту строку с помощью
DateFormat
илиSimpleDateFormat
. Почему ваш пакетorg.joda.time
btw? Вы где-нибудь используете JodaTime?2. Мой плохой, я думал, что собираюсь его использовать, пошел другим путем.
3. Формат SimpleDateFormat = новый формат SimpleDateFormat(«ММ дд гггг»); попробуйте { Дата проанализирована = format.parse(dateString); System.out.println( проанализировано. toString()); все еще возникают проблемы
4. Если у вас есть какие-либо ошибки / проблемы, вы должны сообщить нам, что это такое, пожалуйста, не заставляйте нас гадать. Также обратите внимание, что когда вам требуется, чтобы формат
MM dd yyyy
вашего ввода был действительной датой именно в этом формате (месяц и день могут быть 1 или 2 цифры).
Ответ №1:
Вот подсказка о том, как вы могли бы прочитать и проанализировать введенную дату:
SimpleDateFormat f = new SimpleDateFormat("MM/dd/yyyy"); //note that mm is minutes, so you need MM here
Scanner s = new Scanner( System.in );
String dateLine = s.nextLine();
try
{
Date d = f.parse( dateLine );
System.out.println(d);
}
catch( ParseException e )
{
System.out.println("please enter a valid date in format mm/dd/yyyy");
}
Это всего лишь пример, и вы должны начать с правильного чтения даты.
Для получения лет, дней и месяцев между двумя датами я бы все же рекомендовал использовать JodaTime, поскольку это значительно упрощает жизнь.
Используя стандартные средства Java, это может помочь вам:
Calendar c = Calendar.getInstance();
c.setTimeInMillis( System.currentTimeMillis() - d.getTime() );
System.out.println( c.get( Calendar.YEAR ) - 1970 ); //since year is based on 1970, subtract that
System.out.println( c.get( Calendar.MONTH ) );
System.out.println( c.get( Calendar.DAY_OF_MONTH ) );
Обратите внимание, что вам нужно вычесть меньшую дату из большей, т. Е. Разница должна быть положительной (что должно быть верно при вычитании дат рождения из текущего времени).
Это дало бы разницу в 0 лет, 9 полных месяцев и 26 дней между 1 января 2011 года и 26 октября 2011 года, а также разницу в 21 год и 1 день (поскольку мы уже начали этот день) между 26 октября 1990 года и 26 октября 2011 года.
Комментарии:
1. Введите свою дату рождения.(мм / дд / гггг): 01/10/1991 Чт Янв 10 00:00:00 по тихоокеанскому времени 1991 Пожалуйста, введите месяц от 1 до 12. это то, что он выдает, если я попытаюсь изменить день, год и месяцто о дд, ММ, гггг выдаетя исключение в потоке «main» java.lang. Ошибка: неразрешенные проблемы с компиляцией: dd не может быть преобразован в переменную dd не может быть преобразован в переменную в org.joda.time. AgeCalculation.main(AgeCalculation.java:66) итак, я полагаю, что с помощью SimpleDateFormat он понимает, что день — это dd, а MM — месяц
2. @PythagorasPi С приведенным выше кодом сканера вам не нужны дополнительные запросы для чтения месяца и т. Д. По отдельности, Поэтому удалите этот код. Кроме того, не будет
dd
переменной, если просто установить шаблон на"MM/dd/yyy"
— это просто шаблон, которыйSimpleDateFormat
понимает, как описано в JavaDoc этого класса. Вы не можете просто изменить день и т.д. даты чтения. Для этого вам нужно использоватьCalendar.set(...)
.
Ответ №2:
Если вы хотите использовать JodaTime:
String dob = myScanner.nextLine();
DateTimeFormatter format = DateTimeFormatter.forPattern("MM/dd/yyyy");
DateTime dateTimeOfBirth = DateTime.parse(dob, format);
year = dateTimeOfBirth.getYear();
// Etc
Ответ №3:
попробуйте это, он помещает возраст в поле формы с именем age в форме с именем «форма», предполагается, что вы назвали свое текстовое поле (где вводится DOB) «dob»
var d =document.getElementById('dob').value.split('/');
var today = new Date();
var bday = new Date(d[2],d[1],d[0]);
var age = today.getFullYear() - bday.getFullYear();
if(today.getMonth() < bday.getMonth() || (today.getMonth() == bday.getMonth() amp;amp; today.getDate() < bday.getDate()))
{
t = age--;
}
else {
t = age
}
form.age.value = t;
}
Ответ №4:
Вам, вероятно, понадобится что-то подобное:
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy", Locale.US);
Date date = sdf.parse(timestamp);
Calendar cd = Calendar.getInstance();
cd.setTime(date);