Java:从任何日期获取周数?

2022-09-04 23:45:24

我有一个小程序,显示从今天日期开始的当前星期,如下所示:

GregorianCalendar gc = new GregorianCalendar();
int day = 0;
gc.add(Calendar.DATE, day);

然后是显示周数的 JLabel:

JLabel week = new JLabel("Week " + gc.get(Calendar.WEEK_OF_YEAR));

所以现在我想有一个JTextField,您可以在其中输入日期,JLabel将使用该日期的周号进行更新。我真的不知道如何做到这一点,因为我对Java很陌生。是否需要将输入另存为字符串?整数?它必须是什么格式(yyyyMMdd等)?如果有人能帮助我,我将不胜感激!


答案 1

是否需要将输入另存为字符串?整数?

使用 时,您从用户处获得的输入是 ,因为日期可以包含类似 或 的字符,具体取决于您选择的日期格式。当然,您也可以使用一些更复杂的输入法,其中输入字段已经验证了日期格式,并返回日,月和年的单独值,但使用当然更容易开始。JTextFieldString.-JTextField

它必须是什么格式(yyyyMMdd等)?

这取决于您的要求。可以使用 SimpleDateFormat 类来分析任何日期格式:

String input = "20130507";
String format = "yyyyMMdd";

SimpleDateFormat df = new SimpleDateFormat(format);
Date date = df.parse(input);

Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.WEEK_OF_YEAR);

但更有可能的是,您希望使用特定于您的区域设置的日期格式:

import java.text.DateFormat;

DateFormat defaultFormat = DateFormat.getDateInstance();
Date date = defaultFormat.parse(input);

要向用户提示要使用的格式,您需要将 转换为 a 以获取模式字符串:DateFormatSimpleDateFormat

if (defaultFormat instanceof SimpleDateFormat) {
   SimpleDateFormat sdf = (SimpleDateFormat)defaultFormat;
   System.out.println("Use date format like: " + sdf.toPattern());
}

上面@adenoyelle的评论提醒我:为日期解析代码编写单元测试


答案 2

Java 1.8 在包中为您提供了一些新的类:java.time

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.IsoFields;

ZonedDateTime now = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
System.out.printf("Week %d%n", now.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));

在您的特定情况下,大多数旧日历都可以轻松转换为/通过互操作性方法。java.time.ZonedDateTimejava.time.InstantGregorianCalendar.toZonedDateTime()


推荐