- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新: 好的,我似乎找到了一半的答案。如果我使用无参数 getInstance 创建我的日历,我得到 WEEK_OF_YEAR = 52。但是,如果我通过向 getInstance 提供 Local.getDefaul() 创建它,我得到 WEEK_OF_YEAR = 1。完全没想到这个......我想需要重新阅读日历文档。
根据时间戳构建日历,时间戳对应于星期六,2011 年 1 月 1 日 00:00:00 GMT。
使用 java.util.Date、Calendar 和 TimeZone 的相同代码在不同机器(具有相同语言环境)上表现不同;日历中的所有字段都相同,除了 WEEK_OF_YEAR。在我的机器上它是 52(实际上在我的两台机器上)。在我同事的机器上它是 1(这似乎是正确的)。
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
import java.util.Locale;
public class CalendarTest {
public static void main(String[] args) {
Locale l = Locale.getDefault();
System.out.println(l);
Long d = new Long(1293840000000l);
Calendar c = Calendar.getInstance();
c.setTimeZone(TimeZone.getTimeZone("UTC"));
c.setTime(new Date(d));
System.out.println(c.toString());
}
..语言环境是 en_US,但日历是:
>java.util.GregorianCalendar[time=1293840000000,
areFieldsSet=true,
areAllFieldsSet=true,
lenient=true,
zone=sun.util.calendar.ZoneInfo[
id="UTC",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,lastRule=null
],
firstDayOfWeek=2,
minimalDaysInFirstWeek=4,
ERA=1,
YEAR=2011,
MONTH=0,
WEEK_OF_YEAR=52,
WEEK_OF_MONTH=0,
DAY_OF_MONTH=1,
DAY_OF_YEAR=1,
DAY_OF_WEEK=7,
DAY_OF_WEEK_IN_MONTH=1,
AM_PM=0,HOUR=0,
HOUR_OF_DAY=0,
MINUTE=0,
SECOND=0,
MILLISECOND=0,
ZONE_OFFSET=0,
DST_OFFSET=0]
可能是什么导致了 WEEK_OF_YEAR 不一致?
最佳答案
firstDayOfWeek
和 minimalDaysInFirstWeek
原来是一个特性,而不是一个错误。
导致您看到不同行为的原因是问题中显示的输出中报告的两个设置:
firstDayOfWeek
minimalDaysInFirstWeek
阅读类和子类的文档很重要:
第二个文档详细解释了上面列出的这两个设置对于确定本地化周的重要性。
注意日历。 2011 年的第一天是星期六。每月的第二个星期日,星期日是美国默认的一周开始时间。
在设置为美国区域设置的 Mac OS X 计算机上,这些设置均为 1
。如果所需的最少天数为 1,则第一个登陆在本地化的第 1 周。Java 报告了这一点。
但在您报告的问题机器上,这些设置分别为 2 和 4。我不知道您是如何从通常的默认设置中更改这些设置的,但您确实做到了。
firstDayOfWeek
| 1
与 2
(周日与周一)minimalDaysInFirstWeek
| 1
与 4
最少 4 天意味着第一天不符合新年的一周。所以现在是前一年(2010 年)的第 52 周。 2011 年的第一周是 2011 年 1 月 2 日到 1 月 8 日。
因此,根据 Java 7 中 java.util.Calendar 类的文档,您看到的行为符合预期。谜团是这些设置是如何从您的问题机器上的默认设置更改的?
顺便说一下,文档提到 2 和 4 的设置为您提供了 ISO 8601 定义的行为标准,如 my other answer 中所述.这可能是关于为什么这些设置在您的问题机器上不是默认设置的线索。某些人(系统管理员或程序员)可能正在尝试获得标准行为而不是本地化行为。
让我们用一些代码来证明这一点。我们将使用问题代码的修改版本。我们此处的代码明确设置了相关变量。所以你可以在你的任何一台机器上运行这个例子,无论是正常的还是有问题的。首先,我们强制使用美国语言环境机器上的默认设置,1
& 1
。然后我们使用问题中报告的设置,2
& 4
。
Locale l = Locale.getDefault();
System.out.println( l + "\n" );
Long d = new Long( 1293840000000l );
Calendar c = Calendar.getInstance();
c.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
c.setTime( new Date( d ) );
// Running Java 8 Update 11, Mac OS 10.8.5, virtual machine in Parallels 9, hosted on Mac with Mavericks.
// Force the use of default settings found on a machine set for United States locale (using Apple defaults).
c.setFirstDayOfWeek( 1 );
c.setMinimalDaysInFirstWeek( 1 );
// Reports: WEEK_OF_YEAR=1
System.out.println( "Default US settings:\n" + c.toString() + "\n" );
// Using reported settings (Coincides with ISO 8601 Week definition).
c.setFirstDayOfWeek( 2 );
c.setMinimalDaysInFirstWeek( 4 );
// Reports: WEEK_OF_YEAR=52
System.out.println( "Reported settings (ISO 8601):\n" + c.toString() + "\n" );
运行时...
en_US
Default US settings:
java.util.GregorianCalendar[time=1293840000000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2011,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]
Reported settings (ISO 8601):
java.util.GregorianCalendar[time=1293840000000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2011,MONTH=0,WEEK_OF_YEAR=52,WEEK_OF_MONTH=0,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]
使用ISO 8601 standard weeks ! 😉
感谢 Marco13,他对问题的评论引发了这个答案。
关于java - WEEK_OF_YEAR 在不同机器上不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828014/
更新: 好的,我似乎找到了一半的答案。如果我使用无参数 getInstance 创建我的日历,我得到 WEEK_OF_YEAR = 52。但是,如果我通过向 getInstance 提供 Local.
我在获取时遇到问题 WEEK_OF_YEAR从日历对象。 by passing date '31-Dec-2014': calendar1.get(Calendar.WEEK_OF_YEAR) - r
我尝试通过下面的代码获取一年中的第几周,但它总是返回“3”,我什至将时区设置为 GMT 但仍然返回相同的值(“3”)。请帮帮我这里 DateFormat formatter = new SimpleD
/* package whatever; // don't place package name! */ import java.text.ParseException; import java.te
这个问题已经有答案了: android how to identify the same days of a week (3 个回答) 已关闭 5 年前。 当我执行下面的代码时,我得到相同的输出。 p
Calendar.WEEK_OF_YEAR 无法正常工作。我的目标是每个星期一都是新的一周。我得到的结果在代码注释中。 我的代码是: Calendar cal = Calendar.getInstan
几天来我一直在努力让它发挥作用,但我已经筋疲力尽了。我想我只需要另一双眼睛来帮助我。 我将“条目”存储在数据库中,每个条目在输入时都有一个 Unix 时间戳。我有一个系统,用户可以在其中选择任何日期并
给定 week_of_year,我如何获取该周的开始和结束日期? 示例:假设日期是 2017 年 1 月 1 日。 Calendar calendar = Calendar.getInstance()
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
下面的代码在 Nougat 和 pre-Nougat 上给出了不同的结果。看一看,如果你愿意,可以自己尝试一下。如果有人能向我解释原因并提供解决方案,我将不胜感激。 我想要正确的 WEEK_OF_YE
例如:给定月份 = 2,并给定年份 = 2014,我使用以下代码获得了周列表。为什么我为月份申请 1 是默认月份仅以索引开始。 示例代码: Calendar calendar = Calendar.g
这个问题在这里已经有了答案: Why dec 31 2010 returns 1 as week of year? (6 个答案) Understanding java.util.Calendar
这个问题在这里已经有了答案: Why dec 31 2010 returns 1 as week of year? (6 个答案) 关闭 4 年前。 我试图了解 java.util.Calendar
要么我不理解方法 getActualMaximum(int) 或字段 WEEK_OF_YEAR,要么涉及 Sun 错误(或所有三个)...有人可以向我解释为什么(至少在德语语言环境中...) 以下代码
这个问题已经有答案了: 奥 git _a (1 个回答) 已关闭 6 年前。 我正在执行以下 Java 代码: Calendar cal = Calendar.getInstance(TimeZone
ISO-8601 标准指出 "The first week of a year is the week that contains the first Thursday of the year (an
Mongodb 的 $week operator州 Takes a date and returns the week of the year as a number between 0 and 53
知道年、年中的星期和星期中的日期,就可以获得年中的月份和月份中的日期。例如 // corresponding to September 15, 2012 if week starts on Mond
尝试查找给定日期的星期几。 使用下面的代码。 [Java 1.7] 问题: 2012 年 12 月 29 日 = 第 52 周 2012 年 12 月 30 日 = 第 1 周 2013 年 12 月
好吧,这个难倒我了。我有以下尝试创建此字符串的代码: OUTPUT: 52. 2012 (24 Dec to 30 Dec) 这是 2012 年第 52 周的开始和结束,星期一是一周的第一天。 pri
我是一名优秀的程序员,十分优秀!