如何从scala中的java.util.date提取周数



我已经尝试使用:Getweekgetcalendardate而且我不想使用日历软件包(因为我使用的是不允许我使用的特定软件)预先感谢,

这是Javadoc的API文档-Java.util.date

您应该能够看到java.utils.Date没有获得一周的方法。

人们通常使用Calender来满足各种要求。在您的情况下,您可以使用DateFormatDate对象格式化为String,然后将其解析以获取整数值。

import java.text.SimpleDateFormat
import java.util.Date
val date = new Date()
// if you want week in year
val formatter1 = new SimpleDateFormat("w")
val week1 = Integer.parseInt(formatter1.format(date))
// if you want week in month
val formatter2 = new SimpleDateFormat("W")
val week2 = Integer.parseInt(formatter2.format(date))

我很抱歉无法编写Scala代码。我将不得不相信您可以从我的Java片段中适应。

如果可以,请放弃过时的Date类。使用java.time,现代Java日期和时间API。

使用ZonedDateTime
    int weekNumber = myZonedDateTime.get(WeekFields.ISO.weekOfYear());

OffsetDateTimeLocalDateTimeLocalDate也可以使用。对于今天的日期或日期时间(2017年12月6日),您将获得49。

我使用了ISO 8601周(星期一是一周中的第一天,第1周是一月份至少有4天的第一周)。如果您的几周不同,请替换一个不同的WeekFields对象,例如WeekFields.SUNDAY_START

如果您无法避免获得老式的Date对象,请将其转换为现代Instant,然后使用现代API进行进一步的操作:

    ZonedDateTime converted = oldFashionedDate.toInstant()
            .atZone(ZoneId.of("Pacific/Nauru"));

请替换您所需的时区(前提是您不想要太平洋/瑙鲁)。获得ZonedDateTime后,请按照上述。

import java.util.Calendar
import java.util.GregorianCalendar 
val calendar = new GregorianCalendar()
calendar.setTime(sail_dt)   
calendar.get(Calendar.WEEK_OF_YEAR)

最后,我设法找到了一个Scala代码来解决我的问题。谢谢大家。

tl; dr

org.threeten.extra.YearWeek.from(
    myJavaUtilDate.toInstant()
                  .atZone( ZoneId.of( "Pacific/Auckland" )  )
).getWeek()

49

YearWeek

Ole V.V.的答案是正确而明智的。

(Java语法在这里;不知道Scala)

如果在周上做很多工作,并且您对一周的定义与ISO 8601的定义一周的定义,其中#1符合第一个星期四,而星期一是第一天,则考虑添加Threeten-Extra 库,到您的项目。该库包含许多延长Java.Time类功能的类。特别是YearWeek类。

首先将陷入困境的java.util.Date对象转换为Java.Time。

Instant类代表UTC中时间轴上的瞬间,其分辨率为纳秒(小数分数的9(9)位数)。

Instant instant = myJavaUtilDate.toInstant();

分配要感知日期的时区。时区对于确定日期至关重要。在任何给定的时刻,日期在全球各地划分。例如,午夜在法国的午夜几分钟是新的一天,而仍在魁北克蒙特利尔的"昨天"。

continent/region的格式指定适当的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母缩写,例如ESTIST,因为它们不是真实时区,而不是标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

生成YearWeek的对象,以在ISO 8601周的日期系统中代表这一时刻的一周,这是基于一周的一周和一周的年度组合。

YearWeek yw = YearWeek.from( zdt ) ;

如果要使用标准ISO 8601格式表示该值,只需致电YearWeek::toString即可。

String output = yw.toString() ;

2017-W49

如果要以整数为整数代表该值,请致电YearWeek::getWeek

int weekNumber = yw.getWeek() ;

49

避免旧日期时间类

顺便说一句,您确实应该避免使用Calendar类,以及DateSimpleDateFormat和Java.sql类。所有这些麻烦的旧日期时间类都是遗产,完全由Java.Time类取代。


关于java.time

Java.Time框架内置在Java 8及更高版本中。这些课程取代了麻烦的旧旧日期时间类,例如java.util.DateCalendar,&SimpleDateFormat

现在处于维护模式的Joda Time项目建议迁移到Java.Time类。

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

从哪里获得Java.Time课程?

  • Java SE 8 Java SE 9 ,然后
    • 内置。
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6 Java SE 7
    • 大部分Java.Time功能都回到Java 6&7在 Threeten-Backport
  • Android
    • threetenabp project aptapts threeten-backport (上面提到)Android专门。
    • 参见如何使用Threetenabp…

Threeten-Extra 项目扩展了Java.Time,并提供其他类。该项目是可能将来在Java.Time中增加的遗嘱。您可能在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。

最新更新