12

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

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 等)?如果有人可以帮助我,我将不胜感激!

4

8 回答 8

22

我需要将输入保存为字符串吗?一个整数?

使用 aJTextField时,您从用户那里得到的输入是 a String,因为日期可以包含.或之类的字符-,具体取决于您选择的日期格式。当然,您也可以使用一些更复杂的输入法,其中输入字段已经验证了日期格式,并返回单独的日、月和年值,但使用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);

为了给用户提示使用哪种格式,您需要将DateFormat转换为 aSimpleDateFormat以获取模式字符串:

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

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

于 2013-05-07T12:19:42.753 回答
17

Java 1.8 在 package 中为您提供了一些新类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.ZonedDateTime/通过互操作性方法。java.time.InstantGregorianCalendar.toZonedDateTime()

于 2016-11-08T19:53:49.867 回答
11
于 2017-07-10T01:16:46.880 回答
6

WeekFields

我创建的这个方法适用于 Java 8 及更高版本,使用WeekFieldsDateTimeFormatterLocalDateTemporalField.

不要忘记根据您的用例正确格式化您的日期!

public int getWeekNum(String input) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/dd/yy");   // Define formatting pattern to match your input string.
    LocalDate date = LocalDate.parse(input, formatter);                     // Parse string into a `LocalDate` object.

    WeekFields wf = WeekFields.of(Locale.getDefault()) ;                    // Use week fields appropriate to your locale. People in different places define a week and week-number differently, such as starting on a Monday or a Sunday, and so on.
    TemporalField weekNum = wf.weekOfWeekBasedYear();                       // Represent the idea of this locale’s definition of week number as a `TemporalField`. 
    int week = Integer.parseInt(String.format("%02d",date.get(weekNum)));   // Using that locale’s definition of week number, determine the week-number for this particular `LocalDate` value.

    return week;
}
于 2018-03-20T17:12:24.677 回答
3

您可以将日期存储为字符串,并且用户可以以您指定的几乎任何格式输入它。您只需要使用一个DateFormat对象来解释他们输入的日期。例如,请参阅在 Java中将字符串转换为日历对象的最佳答案

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));

要从 a 中读取日期JTextField,您可以将其替换为:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // or any other date format
cal.setTime(sdf.parse(dateTextField.getText()));

然后,您只需要以与问题中显示的方式相同的方式读取周数cal。(这是一个简化的示例。您需要处理该方法ParseException引发的潜力DateFormat parse。)

于 2013-05-07T12:20:33.953 回答
1
public static int getWeek() {
        return Calendar.getInstance().get(Calendar.WEEK_OF_YEAR);
    }

工作正常并返回当前实时的一周

于 2015-02-15T12:59:53.990 回答
1

SimpleDateFormatter您可以使用它,但您必须使用of将日期值解析为正确的日期格式java API。您可以指定任何您想要的格式。之后,您可以进行操作以获取一年中的一周。

于 2013-05-07T12:17:55.797 回答
0

这个对我有用

public void sortListItems(List<PostModel> list) {
    Collections.sort(list, new Comparator<PostModel>() {
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        @Override
        public int compare(PostModel o1, PostModel o2) {
            int ret = 0;
            try {
                ret = dateFormat.parse(o1.getDate()).compareTo(dateFormat.parse(o2.getDate()));
                return ret;
            } catch (ParseException e) {
                e.printStackTrace();
            }

            return ret;
        }
    });
}
于 2018-02-13T14:34:29.890 回答