如何从 Scala 中的 java.util.Date 中提取周数

How can I extract the week number from java.util.Date in scala

我已经尝试使用: 得到星期 获取日历日期 而且我不想使用日历包(因为我使用的是不允许我使用它的特定软件) 提前致谢,

这是 JavaDoc - java.util.Date

的 API 文档

你应该能看到 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 片段进行改编。

如果可以,放弃早已过时的Dateclass。例如使用来自 java.timeZonedDateTime,现代 Java 日期和时间 API.

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

同样适用于 OffsetDateTimeLocalDateTimeLocalDate。对于今天(2017 年 12 月 6 日)的日期或日期时间,您得到 49。

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

如果您无法避免获得老式 Date 对象,请将其转换为现代 Instant 并使用现代 API:

进行进一步操作
    ZonedDateTime converted = oldFashionedDate.toInstant()
            .atZone(ZoneId.of("Pacific/Nauru"));

请替换您想要的时区(前提是您不需要 Pacific/Nauru)。获得 ZonedDateTime 后,请按照上述步骤进行操作。

tl;博士

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

49

YearWeek

正确而明智。

(Java 语法在这里;不懂 Scala)

如果用周做很多工作,并且您对周的定义符合ISO 8601 definition of week where week # 1 contains the first Thursday and where Monday is the first day-of-week, then consider adding the ThreeTen-Extra library to your project. That library includes many classes extending the functionality of the java.time classes. In particular is a YearWeek class。

首先将麻烦重重的 java.util.Date 对象转换为 java.time.

Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

Instant instant = myJavaUtilDate.toInstant();

指定您希望通过其感知日期的时区。时区对于确定日期至关重要。对于任何给定时刻,日期在全球范围内因地区而异。例如,Paris France is a new day while still “yesterday” in Montréal Québec.

午夜后几分钟

指定 proper time zone name in the format of continent/region, such as America/Montreal, Africa/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

避免遗留日期时间 classes

顺便说一句,你确实应该避免 Calendar class,以及 DateSimpleDateFormat 和 java.sql classes。所有那些麻烦的旧日期时间 classes 现在都是遗留的,完全被 java.time classes 取代。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

import java.util.Calendar
import java.util.GregorianCalendar 

val calendar = new GregorianCalendar()

calendar.setTime(sail_dt)   
calendar.get(Calendar.WEEK_OF_YEAR)

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