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

时间:2017-12-06 10:46:21

标签: scala week-number java.util.date

我已经尝试过使用: getWeek getCalendarDate 我不想使用Calendar包(因为我使用的是不允许我使用它的特定软件) 提前谢谢,

4 个答案:

答案 0 :(得分:1)

很抱歉我无法编写Scala代码。我将不得不相信你能从我的Java片段中进行调整。

如果可以的话,放弃长期过时的Date课程。例如,使用来自ZonedDateTime的{​​{1}},即现代Java日期和时间API。

java.time

同样适用于 int weekNumber = myZonedDateTime.get(WeekFields.ISO.weekOfYear()); OffsetDateTimeLocalDateTime。对于今天(2017年12月6日)的日期或日期时间,您将获得49。

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

如果您无法避免获得旧式WeekFields.SUNDAY_START对象,请将其转换为现代Date并使用现代API执行进一步操作:

Instant

请替换您想要的时区(前提是您不想要太平洋/瑙鲁)。获得 ZonedDateTime converted = oldFashionedDate.toInstant() .atZone(ZoneId.of("Pacific/Nauru")); 后,按上述步骤操作。

答案 1 :(得分:1)

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

val calendar = new GregorianCalendar()

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

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

答案 2 :(得分:0)

以下是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))

答案 3 :(得分:0)

TL;博士

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

49

YearWeek

Answer by Ole V.V.是正确而明智的。

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

如果在几周内做了很多工作,并且您对周的定义与ISO 8601 definition of week一致,其中第1周包含第一个星期四,星期一是第一个星期几,那么请考虑添加{{3库到你的项目。该库包含许多扩展java.time类功能的类。特别是ThreeTen-Extra类。

首先将可疑的java.util.Date对象转换为java.time。

YearWeek类代表Instant中时间轴上的一个时刻,分辨率为UTC(小数部分最多九(9)位)。

Instant instant = myJavaUtilDate.toInstant();

指定要通过其查看日期的时区。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在nanoseconds午夜后的几分钟是新的一天,而Paris France中仍然是“昨天”。

continent/region的格式指定Montréal Québec,例如proper time zone nameAmerica/MontrealPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

生成YearWeek对象,以表示ISO 8601周日期系统中该时刻的年周,即基于周的年和基于周的年的组合。

YearWeek yw = YearWeek.from( zdt ) ;

如果您想使用标准ISO 8601格式表示该值,只需致电Africa/Casablanca即可。

String output = yw.toString() ;
  

2017-W49

如果您想将周数表示为整数,请拨打YearWeek::toString

int weekNumber = yw.getWeek() ;
  

49

避免遗留日期时间类

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

关于java.time

YearWeek::getWeek框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和& Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial

从哪里获取java.time类?

How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-ExtraIntervalYearWeekYearQuarter