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

Java:从任何日期获取周数?,java,calendar,Java,Calendar,我有一个小程序,显示从今天开始的当前一周,如下所示: 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将使用该日期的周数进行更

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

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

您可以使用它,但必须使用
javaapi
SimpleDateFormatter
将日期值解析为正确的日期格式。可以指定所需的任何格式。在那之后,你可以做你的操纵来获得一年中的一周

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

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

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

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

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
转换为
SimpleDateFormat
,以获取模式字符串:

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

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

您可以将日期存储为字符串,用户可以以您指定的几乎任何格式输入它。您只需要使用
DateFormat
对象来解释它们输入的日期。例如,请参见上的

要从
JTextField
读取日期,您可以将其替换为以下内容:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // or any other date format
cal.setTime(sdf.parse(dateTextField.getText()));
然后,您只需按照问题中显示的方式读取
cal
中的周数。(这是一个简化的示例。您需要处理
DateFormat
方法引发的潜在
ParseException


Java 1.8在包
Java中为您提供了一些新类。时间

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.Instant
,在您的特定情况下
gregoriacalendar.toZonedDateTime()

tl;博士 四,

ISO 8601标准周 如果您想要标准,而不是一周的本地化定义,请使用项目中的类,该类为Java 8及更高版本中内置的类添加功能

ISO-8601将一周定义为始终从星期一开始。第一周是包含日历年第一个星期四的一周。因此,此类中使用的基于周的年份与日历年不一致

首先,得到今天的日期。该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

或者让用户通过键入字符串来指定日期。解析日期的字符串输入包含在许多其他问题和答案中。最简单的方法是让用户使用标准ISO 8601格式,YYYY-MM-DD,例如
2017-01-23

LocalDate ld = LocalDate.parse( "2017-01-23" ) ; 
对于其他格式,请指定用于分析的格式。在堆栈溢出中搜索使用该类的许多示例

DateTimeFormatter f = DateTimeFormatter.ofPattern( "d/M/uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( "1/23/2017" , f ) ;
获取
YearWeek

YearWeek yw = YearWeek.from( ld ) ;

创建字符串时,请考虑使用YYYY WWW,如<代码> 2017—W45 < /代码>。或者您可以提取每个数字

  • YearWeek::getWeek
    –获取基于周的年字段
  • YearWeek::getYear
    –获取基于周的年份字段
一周的其他定义 以上讨论假设您按周和编号进行。如果您想要周和周编号的替代定义,请参见使用区域设置的定义


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • 带来了一些小功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • Android(26+)的更高版本捆绑了java.time类的实现
    • 对于早期的Android(这一款对我很有用

      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;
              }
          });
      }
      
      public void排序项(列表){
      Collections.sort(list,newcomparator(){
      DateFormat DateFormat=新的SimpleDateFormat(“dd/MM/yyyy HH:MM:ss”);
      @凌驾
      公共整数比较(模型后o1,Po
      
      LocalDate ld = LocalDate.parse( "2017-01-23" ) ; 
      
      DateTimeFormatter f = DateTimeFormatter.ofPattern( "d/M/uuuu" , Locale.US ) ;
      LocalDate ld = LocalDate.parse( "1/23/2017" , f ) ;
      
      YearWeek yw = YearWeek.from( ld ) ;
      
      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;
              }
          });
      }
      
      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;
      }