JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java修炼终极指南:65. 在int和YearMonth之间转换

wys521 2024-11-12 14:23:16 精选教程 33 ℃ 0 评论


假设我们有YearMonth.now(),我们想将其转换为一个整数(例如,这可能对使用数据库中的数字字段存储年/月日期很有用)。解决方案如下:

public static int to(YearMonth u) {
  return (int) u.getLong(ChronoField.PROLEPTIC_MONTH);
}


proleptic-month是一个java.time.temporal.TemporalField,它基本上代表一个日期时间字段,如一年中的月份(我们的情况)或一小时中的分钟。proleptic-month从0开始,从公元0年顺序计算月份。因此,getLong()返回此year-month中指定字段(此处为proleptic-month)的值,作为一个long。我们可以将这个long转换为int,因为proleptic-month不会超出int的范围(例如,对于2023/2,返回的int是24277)。

反之,可以按如下方式完成:

public static YearMonth from(int t) {
  return YearMonth.of(1970, 1)
    .with(ChronoField.PROLEPTIC_MONTH, t);
}


你可以从任何年/月开始。1970/1(被称为纪元,是java.time.Instant的起始点)的选择只是任意选择。

66. 将周/年转换为Date

让我们考虑2023年,第10周。相应的日期是2023年3月5日星期日15:15:08 EET(当然,时间部分是相对的)。通过Calendar API,可以将年/周转换为java.util.Date,如下所示的自解释代码片段:

public static Date from(int year, int week) {
  Calendar calendar = Calendar.getInstance();
  calendar.set(Calendar.YEAR, year);
  calendar.set(Calendar.WEEK_OF_YEAR, week);
  calendar.set(Calendar.DAY_OF_WEEK, 1);
  return calendar.getTime();
}


如果你更喜欢获得一个LocalDate而不是Date,那么你可以很容易地执行相应的转换,或者你可以依赖于java.time.temporal.WeekFields。这个API公开了几个字段,用于处理一年中的周数、一个月中的周数和一周中的天数。也就是说,这是通过WeekFields返回LocalDate的先前解决方案:

public static LocalDate from(int year, int week) {
  WeekFields weekFields = WeekFields.of(Locale.getDefault());
  return LocalDate.now()
                  .withYear(year)
                  .with(weekFields.weekOfYear(), week)
                  .with(weekFields.dayOfWeek(), 1);
}


另一方面,如果我们有一个java.util.Date,我们想从中提取年份和周数,那么我们可以使用Calendar API非常直接。这里,我们提取年份:

public static int getYear(Date date) {
          
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
      
  return calendar.get(Calendar.YEAR);
}


在这里,我们提取周数:

public static int getWeek(Date date) {          
    
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
      
  return calendar.get(Calendar.WEEK_OF_YEAR);
}


多亏了ChronoField.YEAR和ChronoField.ALIGNED_WEEK_OF_YEAR,从LocalDate中获取年份和周数很容易:

public static int getYear(LocalDate date) {
                       
  return date.get(ChronoField.YEAR);
}

public static int getWeek(LocalDate date) {
  
  return date.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
}


当然,通过WeekFields也可以获得周数:

return date.get(WeekFields.of(
  Locale.getDefault()).weekOfYear());        


挑战自己,尝试从Date/LocalDate中获取周/月和日/周。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表