【问题标题】:How can I extract the week number from java.util.Date in scala如何从 scala 中的 java.util.Date 中提取周数
【发布时间】:2017-12-06 10:46:20
【问题描述】:

我已经尝试过使用: 获取周 获取日历日期 而且我不想使用 Calendar 包(因为我正在使用不允许我使用它的特定软件) 提前致谢,

【问题讨论】:

  • 您为什么要使用早已过时的Date 类? java.time, the modern Java date and time API,使用起来更好。
  • 这在很大程度上取决于您的周数和编号方式。如果一周中的第一天是一周中的哪一天?第 1 周从新年前后的哪一天开始?并非世界各地都在使用 ISO 标准。

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


【解决方案1】:

这里是JavaDoc - java.util.Date 的 API 文档

您应该可以看到java.utils.Date 没有获取星期的方法。

人们通常使用Calender 来满足各种要求。在您的情况下,您可以使用DateFormat 将您的Date 对象格式化为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))

【讨论】:

    【解决方案2】:

    很抱歉,我无法编写 Scala 代码。我必须相信你会适应我的 Java sn-ps。

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

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

    OffsetDateTime、LocalDateTime 和 LocalDate 也是如此。对于今天(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"));
    

    请替换您想要的时区(前提是您不想要太平洋/瑙鲁)。获得ZonedDateTime 后,按上述方式进行操作。

    【讨论】:

      【解决方案3】:
      import java.util.Calendar
      import java.util.GregorianCalendar 
      
      val calendar = new GregorianCalendar()
      
      calendar.setTime(sail_dt)   
      calendar.get(Calendar.WEEK_OF_YEAR)
      

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

      【讨论】:

        【解决方案4】:

        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 周包含第一个星期四,星期一是一周中的第一天,那么请考虑将 ThreeTen-Extra 库添加到你的项目。该库包括许多扩展 java.time 类功能的类。特别是 YearWeek 类。

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

        Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。

        Instant instant = myJavaUtilDate.toInstant();
        

        指定您想要感知日期的时区。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

        以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

        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 类,以及 Date、SimpleDateFormat 和 java.sql 类。所有那些麻烦的旧日期时间类现在都是遗留的,完全被 java.time 类所取代。


        关于java.time

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

        Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

        要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

        从哪里获得 java.time 类?

        ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 2022-10-18
          • 2020-03-29
          • 2014-05-29
          • 2017-05-04
          • 2014-11-10
          • 2016-03-07
          • 1970-01-01
          • 2022-11-11
          相关资源
          最近更新 更多