【问题标题】:Challenging Java/Groovy Date Manipulation挑战 Java/Groovy 日期操作
【发布时间】:2011-03-12 05:13:54
【问题描述】:

我有一堆用年和周格式化的日期,如下:

2011-10

周值是一年中的第几周(所以 1-52)。根据本周的值,我需要输出如下内容:

Mar 7

明确地说,我需要给定周所在的月份,以及该周第一个星期一的日期。也就是说,一年中的第 10 周是 3 月 7 日这一周。

我正在使用 Groovy。我可以做什么样的日期操作来让它工作?

【问题讨论】:

  • 请在此处查看BalusC给出的答案stackoverflow.com/questions/2109145/…
  • 任何人都可以提供在 Groovy 中有效的答案吗?
  • new java.text.SimpleDateFormat('yyyy-w').parse('2011-10') 不起作用吗?如果没有尝试设置语言环境。
  • 你可以使用 Joda 日期时间库吗?它是一个 Java 库,因此可以很好地与 Groovy 一起使用。

标签: java date groovy


【解决方案1】:

这是一个时髦的解决方案:

use(groovy.time.TimeCategory) {
    def (y, w) = "2011-10".tokenize("-")
    w = ((w as int) + 1) as String
    def d = Date.parse("yyyy-w", "$y-$w") + 1.day
    println d.format("MMM dd")
}

【讨论】:

    【解决方案2】:

    使用 GregorianCalendar(或 Joda,如果您不介意依赖)

        String date = "2011-10";
        String[] parts = date.split("-");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, Integer.parseInt(parts[0]));
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.set(Calendar.WEEK_OF_YEAR, Integer.parseInt(parts[1])+1);
        DateFormat df = new SimpleDateFormat("MMM d");
        System.out.println(df.format(cal.getTime()) + " (" + cal.getTime() + ")");
    

    编辑:为周添加了 +1,因为日历使用从零开始的周数

    【讨论】:

    • 感谢您的帮助。根据您的回答,这就是我到目前为止所拥有的,但它一直在给我<tb 上的错误,任何想法我可能做错了什么? date = "2011-10" parts = date.split("-") cal = new GregorianCalendar() cal.set(Calendar.YEAR, Integer.parseInt(parts[0])) cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY) cal.set(Calendar.WEEK_OF_YEAR, Integer.parseInt(parts[1])+1) cal.time println String.format('%<tb %<te', cal)
    【解决方案3】:
    Date date = new SimpleDateFormat("yyyy-w", Locale.UK).parse("2011-10");
    System.out.println(new SimpleDateFormat("MMM d").format(date));
    

    第一行返回英国语言环境中第 10 周的第一天(3 月 7 日)。当 Locale 没有被强制执行时,结果依赖于默认的 JVM Locale

    格式解释here

    【讨论】:

    • 就像亚当的回答一样,这会返回星期日而不是星期一。
    • 奇怪,它在我的电脑上打印mar 7
    • 它似乎取决于所使用的语言环境。如果您更新答案,我可以删除我的反对票(除非执行编辑,否则我无法删除它)。
    • 谢谢,我强制执行 Locale 以防止依赖于系统的行为。
    【解决方案4】:

    你可以使用SimpleDateFormat,就像在java中一样。见groovyconsole.appspot.com/script/439001

    java.text.DateFormat df = new java.text.SimpleDateFormat('yyyy-w', new Locale('yourlocale'))
    Date date = df.parse('2011-10')
    

    要添加一周,只需使用Date date = df.parse('2011-10')+7

    如果您的默认语言环境使用星期一作为一周的第一天,则无需设置语言环境。

    【讨论】:

    • 我不认为这很有效 - 它为您提供一周中的星期日而不是 OP 要求的星期一。也可能休息一周(请参阅 Sam 的评论:从零开始的周数)。
    • 您可以在日期格式中设置您的语言环境(更新了答案)。
    • 可以通过简单地更改语言环境来检索星期一而不是星期日吗?如果是这样,您能否更新您的示例以反映如何做到这一点?我只问,因为将您的代码简单地复制并粘贴到 en_US 语言环境并不能完全满足问题的要求。
    • groovyconsole.appspot.com/script/439001 。点击“在控制台编辑”->“执行脚本”,结果显示在编辑器下方。
    • 我已经删除了我的反对票。更新您的答案以表明返回的星期几取决于提供给 SimpleDateFormat 实例的语言环境,这可能不会有什么坏处。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2020-10-16
    • 2020-06-05
    • 1970-01-01
    • 2017-08-17
    • 2019-03-30
    • 2016-11-21
    相关资源
    最近更新 更多