相关疑难解决方法(0)

为什么2010年12月31日将作为一年中的一周返回1?

例如:

Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );  
Run Code Online (Sandbox Code Playgroud)

打印1

Joda时间也是如此.

:)

java calendar jodatime week-number

26
推荐指数
3
解决办法
2万
查看次数

JSR-310中两个不同的基于周的年定义的动机是什么?

这些是包中的两个字段java.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear()

ISO-8601定义了除其他两种日期之外的所谓周日期,即通常的日历日期(包括年,月和日)和顺序日期(包括年和日) ).星期日的格式为YYYY-'W'ww-e.w代表一周的年份,e代表数字ISO-星期几.Y代表以周为基础的年份,与日历年相同,但在日历年的开始或结束时除外,因为基于周的年份与最终可能在上一年开始的周周期相关联.有两条规则对于理解星期日的形成非常重要:

  1. 周总是从周一开始.
  2. 日历年的第一周是包含至少四天的一周.

乍一看,两个JSR-310字段看起来都是相同的,因为ISO-8601只提到了一种基于周的年份.但是等一下,惊喜.让我们考虑以下代码示例:

LocalDate date1 = 
  LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01

LocalDate date2 = 
  LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25
Run Code Online (Sandbox Code Playgroud)

虽然我非常了解第二种变化,但我很惊讶看到第一次约会的不同结果是在其类名中使用"官方"ISO-8601-reference.要解释计算结果:

2000-02-29日期对应于ISO-weekdate-notation中的2000-W09-2,而2014-02-25对应于2014-W09-2,保留了一周中的星期和星期几.到目前为止很好.较小字段的这种保留特性类似于如何更改日历年的规则(在大多数情况下应该保持日历日期中的月份和日期不变).

但结果2014-03-01是什么?这里算法简单地将相应的周日添加了四天,以便考虑字段"日期"(29对25)的差异.我没有找到此行为的任何来源或官方文档.有谁知道我们在哪里可以找到这两个领域之间差异的理由?有关算法行为的任何文档?

更新:

现在,我尝试使用此表达式测试新API的自我一致性,以便找出更好地支持哪两个字段:

System.out.println(
  "14 week-based-years later = "
  + LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));
Run Code Online (Sandbox Code Playgroud)

输出是2014-03-01类似于描述的情况IsoFields.WEEK_BASED_YEAR,尽管我仍然发现2014-02-25(= 2014-W09-2)的结果更合乎逻辑.由于此类时间单元也在类中找到,IsoFields因此行为在类中是自洽的IsoFields.看起来像一个没有文档和非直观的"功能".

我使用的版本是:java.runtime.version = 1.8.0-b132

更多测试:

LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println( …
Run Code Online (Sandbox Code Playgroud)

java iso8601 java-8 java-time

14
推荐指数
1
解决办法
2010
查看次数

7
推荐指数
2
解决办法
4087
查看次数

Java和多SQL RDBMS之间的一周计算差异

我必须做一些报告,并且必须在Java和MySQL的任何日期计算周,但他们有不同的算法.

首先,请注意,通过一些方法,在某一年结束的某些日子里,是明年的第一周.示例:2012-12-31是2013年的第1周(我不记得确切的年份,但它就是这样).所以我必须计算一个约会的正确的一周

在Java中,它基于2个标准,取决于区域设置:

  • 一周的第一天(周日或周一)
  • 第一周的最短日期(1或4)

    Calendar cal = Calendar.getInstance();
    int javaWeek = cal.get(Calendar.WEEK_OF_YEAR);
    int weekYear = cal.getWeekYear();
    
    Run Code Online (Sandbox Code Playgroud)

在MySQL中,它基于2个标准依赖于模式(0到7):

  • 一周的第一天(周日或周一)(Java中也是如此)
  • 第一周的最小天数为4或第一周包含一周的第一天

    SELECT WEEK('2012-12-12', 1);
    SELECT YEARWEEK('2012-12-12', 1);
    
    Run Code Online (Sandbox Code Playgroud)

在MySQL中,一些模式将计算一周的奇怪结果,例如,一年有0周只有1天,其他几周有整整7天(我认为第1周真的是第一周,第0周是前周或某事).我会忽略这些模式

方案是:我在Java中计算了我的系统区域设置(带有设置:getFirstDayOfWeek()==SUNDAY和的区域设置getMinimalDaysInFirstWeek==1)的日期基础列表的周,我想在MySQL中使用相同的结果进行计算

但是我在MySQL中尝试所有8种模式,没有匹配.我失败了,因为在MySQL中没有第一周最小日的模式计算基础是1(只有一些模式有4),所以我手动setMinimalDaysInFirstWeek(4)和MySQL中的模式6匹配Java中的结果

(我必须编写测试,比较Java和MySQL中2年内每天的结果)

所以我的解决方案是,我必须修复 setMinimalDaysInFirstWeek(4),如果getFirstDayOfWeek()是星期一,我在MySQL中选择模式3,如果 getFirstDayOfWeek()是SUNDAY,我在MySQL中选择模式6.我认为这只是一个临时解决方案而且非常奇怪.

还有一个问题,我真的害怕如果我的系统从MySQL变为其他RDBMS,它将有其他方法而我无法处理所有这些(Oracle中的示例没有WEEK功能).那么有什么方法可以让calc周满足很多RDBMS吗?

我有一个想法是在一个平台(Java或MySQL)中的计算周,然后将结果传递给另一个:

  • 如果从Java传递到MySQL,我将结果传递给查询字符串,或者构建一个包含我的结果的表

  • 如果从MySQL传递给Java,我必须编写一个从Java调用它的过程,并且必须解决问题"找到计算方法满足许多RDBMS的方法"

但我必须计算大量的日期,这些都不能满足我,任何人都有想法解决我的问题?

java sql datetime date week-number

5
推荐指数
1
解决办法
1212
查看次数

获取Java的当前星期

我想获取具有给定日期的当前星期,例如,如果日期为2016/01/19,则结果为:week number: 3

我已经看到了一些有关此的问题和答案,但是我无法实现我想要的。这是我所做的:

public static int getCurrentWeek() {
    String input = "20160115";
    String format = "yyyyMMdd";
    SimpleDateFormat df = new SimpleDateFormat(format);
    Date date = df.parse(input);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    int week = cal.get(Calendar.WEEK_OF_YEAR);

    return week;
}
Run Code Online (Sandbox Code Playgroud)

我从这个问题中获取了这段代码,但是在这一行上有一个错误:

Date date = df.parse(input); 
Run Code Online (Sandbox Code Playgroud)

未处理的异常类型ParseException

java date

2
推荐指数
1
解决办法
1万
查看次数

日历获得年份返回错误的结果

我想创建一个日历对象,并将其设置为该年的某一年和一周.

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.WEEK_OF_YEAR, weekOfYear);  // 1
calendar.set(Calendar.YEAR, year); // 2016
setWeekChecked(calendar);
Run Code Online (Sandbox Code Playgroud)

当我将它传递给setWeekChecked方法时,这是日历对象的toString:

java.util.GregorianCalendar中[时间= ?, areFieldsSet =假,宽大=真,区=美国/纽约,Firstdayofweek可= 1,minimalDaysInFirstWeek = 1,ERA = 1,YEAR = 2016,MONTH = 0,WEEK_OF_YEAR = 1,WEEK_OF_MONTH = 2,DAY_OF_MONTH = 7,DAY_OF_YEAR = 7,DAY_OF_WEEK = 5,DAY_OF_WEEK_IN_MONTH = 1,AM_PM = 0,HOUR = 5,HOUR_OF_DAY = 5,MINUTE = 25,SECOND = 43,微差= 219,ZONE_OFFSET = -18000000,DST_OFFSET = 0 ]

在setWeekChecked方法中:

public void setWeekChecked(final Calendar cal) {
    final int targetWeek = cal.get(Calendar.WEEK_OF_YEAR); // Returns 1
    final int targetYear = cal.get(Calendar.YEAR); // Returns 2015??
} …
Run Code Online (Sandbox Code Playgroud)

java android calendar

0
推荐指数
1
解决办法
863
查看次数

标签 统计

java ×6

week-number ×3

calendar ×2

date ×2

iso8601 ×2

android ×1

datetime ×1

java-8 ×1

java-time ×1

jodatime ×1

sql ×1