Задача календаря в месяц добавления +1 к календарному месяцу в Android
Я использую следующий код
Calendar cal = Calendar.getInstance();
System.out.println("Before "+cal.getTime());
cal.set(Calendar.MONTH, 01);
System.out.println("After "+cal.getTime());
вывод
Before Thu Jan 31 10:07:34 IST 2013
After Sun Mar 03 10:07:34 IST 2013
для добавления +1
в jan задается месяц mar. может быть, он возвращает правильный результат, если мы добавим 30 дней к дате. но я хочу показать месяц feb. может любое тело помочь мне пожалуйста.
Ответы
Ответ 1
вы можете видеть, что поле +1 для установки добавляет 30-дневную дату, отличающуюся от ваших дат (с вашего вывода).
если вам нужны месяцы, используйте код
Calendar cal = Calendar.getInstance();
System.out.println("Before "+cal.getTime()); //Before Thu Jan 31 10:16:23 IST 2013
cal.add(Calendar.MONTH, 1);
System.out.println("After "+cal.getTime()); //After Thu Feb 28 10:16:23 IST 2013
Ответ 2
Вы должны использовать add()
like,
cal.add(Calendar.MONTH, 1);
OUTPUT →
Before Thu Jan 31 10:15:04 IST 2013
After Thu Feb 28 10:15:04 IST 2013
Ответ 3
cal.set(Calendar.MONTH, cal.get( Calendar.MONTH ) + 1 );
В любом случае причина, по которой она показывает Mar 3
, заключается в том, что она добавляет 30 дней, а это Feb 31st
, которая не существует, поэтому она переходит в Mar 3
.
Если бы вы хотели получить последний день следующего месяца, вы сделали бы что-то вроде этого:
int month = cal.get( Calendar.MONTH );
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1);
if( cal.get( month ) > month + 1 ) {
cal.set( Calendar.MONTH, month + 1 );
cal.set( Calendar.DAY, /* here comes your day amount finding algorithm */ );
}
Ответ 4
Этот вид работы с датами проще с помощью:
- Joda-Time 2.3 библиотека
- Популярная замена классов java.util.Date и .Calendar в комплекте с Java
- Открытый исходный код
- Бесплатно
- Активно поддерживается (по состоянию на 2014-02)
- пакет java.time
Пример кода
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Or, DateTimeZone.UTC
DateTime dateTime = new DateTime( timeZone );
DateTime monthAgo = dateTime.plusMonths( -1 ); // Smartly handles various month lengths, leap year, and so on.
DateTime monthLater = dateTime.plusMonths( 1 );
Дамп для консоли...
System.out.println( "dateTime: " + dateTime );
System.out.println( "monthAgo: " + monthAgo );
System.out.println( "monthAgo start of day: " + monthAgo.withTimeAtStartOfDay() );
System.out.println( "monthLater: " + monthLater );
При запуске...
dateTime: 2014-02-24T01:53:22.386+01:00
monthAgo: 2014-01-24T01:53:22.386+01:00
monthAgo start of day: 2014-01-24T00:00:00.000+01:00
monthLater: 2014-03-24T01:53:22.386+01:00
Ответ 5
public class NewClass extends JFrame
{
public NewClass()
{
Calendar cal=new GregorianCalendar();
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();
JPanel p=new JPanel();
BorderLayout layout=new BorderLayout();
p1.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel l1=new JLabel("Sunday");
JLabel l2=new JLabel("Monday");
JLabel l3=new JLabel("Tuesday");
JLabel l4=new JLabel("Wednsday");
JLabel l5=new JLabel("Thursday");
JLabel l6=new JLabel("Friday");
JLabel l7=new JLabel("Saturday");
p1.add(l1);
p1.add(l2);
p1.add(l3);
p1.add(l4);
p1.add(l5);
p1.add(l6);
p1.add(l7);
p1.setBorder(new LineBorder(Color.BLACK));
int x=cal.get(Calendar.MONTH)+1;
System.out.println(x);
int y=cal.get(Calendar.DAY_OF_WEEK);
System.out.println(y);
p2.setLayout(new GridLayout(5,7));
if(x==4||x==6||x==9||x==11)
{
int j=1;
for(int i=0;i<(7-(y-1));i++)
{
JLabel l=new JLabel(" ",JLabel.CENTER);
l.setBorder(new LineBorder(Color.BLACK));
p2.add(l);
j++;
}
for(int i=1;i<=30;i++)
{
JLabel l=new JLabel(""+i,JLabel.CENTER);
l.setBorder(new LineBorder(Color.BLACK));
p2.add(l);
j++;
}
}
p.setLayout(layout);
p.add(p2,BorderLayout.CENTER);
p.add(p1,BorderLayout.NORTH);
add(p,BorderLayout.CENTER);
JLabel l8=new JLabel(""+(cal.get(Calendar.MONTH+1)+"/"+cal.get(Calendar.YEAR)));
l8.setHorizontalTextPosition(JLabel.CENTER);
p3.setLayout(new FlowLayout(FlowLayout.CENTER));
p3.add(l8);
add(p3,BorderLayout.NORTH);
add(p,BorderLayout.CENTER);
}