85

Java 8 的DateTimeFormatter类有一个方法 ,ofPattern(String pattern)可以让您从A-z,a-z字母的字符串中定义格式。这些示例没有阐明y, year-of-eraY, week-based-year之间的区别。它是什么?

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 y       year-of-era                 year              2004; 04
 Y       week-based-year             year              1996; 96
4

7 回答 7

60

这是“年-周”样式日期的年份值,如 2006-W52。如果所讨论的一周跨越年份边界,则它可能与年份值相差 +1 或 -1。

http://en.wikipedia.org/wiki/ISO_8601#Week_dates

于 2014-10-17T19:20:50.693 回答
28

tl;博士

表格显示 2019 年 12 月 30 日的日历年是 2019 年,而基于周的年份是 2020 年

表格显示日历年和基于周的年的天数和周数,365 或 366 天与 364 或 371 天,以及 52 部分周与 52 或 53 整周。

细节

其他一些答案很有趣,但很复杂。这是一个希望更简单的答案,让您有方向感。

yu(小写)

year-of-era的y字符只是日历年,这是西方和世界大部分地区使用的常规年份,基于公历

该类DateTimeFormatter也将 au用于几乎相同的事情。对于当代日期,没有区别。有关详细信息,请参阅uuuuyyyyDateTimeFormatterJava 中格式化模式代码?.

对于我们在日常生活中使用的常规日期,您将使用格式模式解析或生成表示日期值的文本,例如:

DateTimeFormatter.ofPattern( "dd/MM/yyyy" ) ;

……或者……</p>

DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;

无论哪种情况,2019 年 12 月 30 日星期一都会被解析为:

LocalDate localDate = LocalDate.parse( "30/12/2019" ) ;

localDate.toString(): 2019-12-30

Y(大写)

各行各业的许多人发现每周跟踪时间很有用,为一年中的每一周分配一个数字。

定义一周的方法有很多种,例如从星期日或星期一开始。因此,有多种方法可以定义一年中的一周。第 1 周有 1 月 1 日吗?还是第 1 周有一年中的第一个星期日?

ISO 8601标准将一周定义为从星期一开始。第 1 周是新日历年的第一个星期四。

这个定义意味着基于周的一年有 52 或 53 个整周,总是 7 天(周一至周日),一年的长度为 364 天或 371 天。相反,一个日历年有 365 天或 366 天,跨越 52 个部分周。

因此,日期 2019-12-30(2019 年 12 月 30 日星期一)实际上是 2020 年的第一周。

显示 2020 年第 1 周的日历,从 2019 年 12 月 30 日开始。

  • 如果您需要生成或解析2020的基于周的年份值,请在格式模式中使用大写YYYY的 2019-12-30 日期。
  • 如果您想要 2019-12-30 的日历年,即2019,请使用小写yyyy

ISO 8601 格式

ISO 8601 标准定义了一种特定格式,用于表示基于周的年份的一周内的日期:YYYY-Www-d 其中YYYY是基于周的年份,-W是固定的,ww表示周数 1-52 或 1 -53,d表示周一至周日运行 1-7 的星期几。

因此,2019 年 12 月 30 日星期一是:2020-W01-1表示基于周的 2020 年、一年中的第一周和一周的第一天(星期一)。

要使用星期几解析 ISO 8601 星期,我们可以使用DateTimeFormatter. 无需使用 定义格式化模式YYYY,因为这项工作已经为您完成。使用内置的DateTimeFormatter.ISO_WEEK_DATE.

String output = localDate.format( DateTimeFormatter.ISO_WEEK_DATE ) ;

2020-W01-1

同样,解析。

LocalDate localDate = 
    LocalDate.parse( 
        "2020-W01-1" , 
        DateTimeFormatter.ISO_WEEK_DATE
    )
;

localDate.toString(): 2019-12-30

三十-额外

ThreeTen -Extra库为 Java 内置的java.time类添加了功能。

org.threeten.extra.YearWeek

该库提供YearWeek类。如果您根据ISO 8601 对周和周年的定义处理周年的周数,这正是您所需要的

此类可以在常规日期格式和面向周的格式之间来回转换。

LocalDate localDate = LocalDate.of( 2019 , Month.DECEMBER , 30 ) ;  // Monday 2019-12-30. Its week-based year is 2020. 
YearWeek yearWeek = YearWeek.from( localDate ) ;
String wFormatted = yearWeek.toString() ;

2020-W01

从中得到一个日期。

LocalDate localDate = yearWeek.atDay( DayOfWeek.MONDAY ) ;

localDate.toString(): 2019-12-30

于 2020-07-02T06:42:08.477 回答
11

每个字段都记录在“字段”类中,例如ChronoFieldWeekFieldsIsoFields

“时代”字段记录在ChronoField.

“基于周的年份”字段记录在WeekFields.

于 2014-10-19T20:52:27.047 回答
2

Y表明我们希望根据 ISO 8601 周编号年份来格式化给定日期。根据维基百科,第 01 周的定义是

包含今年第一个星期四的那一周(正式的 ISO 定义)

因此,

一年中的第一个 ISO 周可能最多有三天,实际上是在即将结束的公历年中

让我们考虑“2019-12-30”日期,即星期一。

显示 ISO 8601 2020 年第 1 周和第 2 周的日历

如果我们看看那一周,我们有 2019 年 12 月 30 日和 31 日是星期一和星期二;2020 年 1 月 1 日至 4 日是周三、周四、周五和周六。如您所见,本周跨越公历年(我们使用的日历系统)2019 年和公历年 2020。如果我们应用上述基于周的年的 week01 的定义,我们可以看到 2019 年 12 月 30 日之间的那一周01/05/2020 是 2020 年的第 01 周(ISO 标准规定一周的开始是星期一)。因此,如果我们想用 dateTimeFormatter 解析“2019-12-30” 'YYYY-MM-dd',正确的结果是'2020-12-30'. 但是,有了'yyyy-MM-dd',最终结果将是'2019-12-30'

System.out.println(LocalDate.parse("2019-12-30").format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))); // output "2020-12-30"
System.out.println(LocalDate.parse("2019-12-30").format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); // output "2019-12-30"

我认为Java实现可能存在潜在问题。如果我们考虑上面 Sam Berry 给出的示例,“2019-12-29”的输出与基于周的年份的定义方式不一致。原因是“2019-12-29”是星期天。如果我们应用上面维基百科的定义,“2019-12-29”应该被解析为“2019-12-29”,即使是给定'YYYY-MM-dd'的。这是因为按照 ISO 标准,week01 的开始是星期一而不是星期日。如果我们查看2020 的周数,我们可以看到 2020 的第 1 周从“2019-12-30”开始。我怀疑这可能是由于 API 的实施者认为一周的开始是星期日,根据 ISO 标准,这是不正确的。

更新

关于Java实现错误的嫌疑。这不是实施错误。感谢下面的Ole VV评论。在格式化期间,对 week01 开始的定义方式存在细微的依赖性,这由Locale. 例如,如果区域设置为欧洲,则一周的开始时间为星期一,这与 ISO 标准一致。因此

System.out.println(LocalDate.of(2019, Month.DECEMBER, 29).format(DateTimeFormatter.ofPattern("YYYY-MM-dd", Locale.FRANCE)));

有输出2019-12-29。但是,在美国,一周的开始被视为星期日。因此

System.out.println(LocalDate.of(2019, Month.DECEMBER, 29).format(DateTimeFormatter.ofPattern("YYYY-MM-dd", Locale.US)));

有输出2020-12-29

于 2020-07-01T20:21:21.563 回答
1

基于周的年份

一周只属于一年的概念。例如:

LocalDate.parse("2019-12-29").format(DateTimeFormatter.ofPattern("M/d/Y")) 
---> "12/29/2020"`

时代

年份的常用用法,1/1 始终是一年的第一天。例如:

LocalDate.parse("2019-12-29").format(DateTimeFormatter.ofPattern("M/d/y"))
---> "12/29/2019"
于 2020-04-06T16:04:57.763 回答
0

我喜欢@xxks-kkk 的回答。如果您对您的区域设置使用哪个星期定义感兴趣,您可以轻松检查它。

简单来说:

星期及其所属年份的定义取决于两个值:

  • 一周的第一天。
  • 第一周的最少天数。

这两个值被封装在WeekFields类中。

下面的代码打印 all possible WeekFieldswith all assignment to it Locales。

public class PrintLocaleWeekFields {

    public static void main(String[] args) {
        Map<WeekFields, List<Locale>> locales = Arrays.stream(Locale.getAvailableLocales())
            .collect(Collectors.groupingBy(WeekFields::of));
        System.out.println(locales);
    }
}

打印结果:

WeekFields[MONDAY,1]=[tk_TM_#Latn, en_NU, ff_LR_#Adlm, es_BO, bs_BA, en_LR, ar_TD, nus_SS_#Latn, ff_MR_#Latn, sw_UG, tk_TM, sr_ME_#Cyrl, os_GE_#Cyrl, yo_NG, en_PW, sr_CS, agq_CM_#Latn, ar_EH, bs_BA_#Latn, dje_NE, hy_AM_#Armn, ff_GH_#Latn, fr_PM, ar_KM, agq_CM, tr_TR, kl_GL_#Latn, ar_MR, kl_GL, en_NR, rw_RW_#Latn, en_CY, tr_TR_#Latn, ti_ER, nus_SS, en_RW, hr_HR_#Latn, ln_CD, nnh_CM, dje_NE_#Latn, ksf_CM, fr_VU, nnh_CM_#Latn, fr_NE, bez_TZ_#Latn, ksb_TZ, ln_CF, en_CX, ak_GH_#Latn, en_TZ, fr_NC, fr_CM, pcm_NG_#Latn, teo_UG, ln_CG, az_AZ, el_CY, ku_TR, ff_SN, sq_MK, sr_BA_#Cyrl, so_SO_#Latn, tr_CY, lv_LV_#Latn, uz_UZ_#Latn, dua_CM, fr_TN, sr_RS, sw_TZ_#Latn, fr_PF, pt_GQ, vun_TZ, jmc_TZ, mg_MG_#Latn, en_TV, en_PN, lu_CD_#Latn, en_GY, dyo_SN, nl_CW, fr_GQ, en_NG, fr_CI, ia_001, en_LC, ff_BF_#Adlm, bm_ML_#Latn, yav_CM_#Latn, mk_MK, sl_SI, sg_CF_#Latn, jgo_CM, ff_NE_#Adlm, en_BM, kea_CV, vi_VN, mfe_MU, fr_BF, fr_YT, ff_CM_#Latn, sr_BA_#Latn, uk_UA_#Cyrl, ff_GW_#Adlm, ha_GH, yi_001_#Hebr, to_TO_#Latn, ff_GW_#Latn, mua_CM_#Latn, nyn_UG, ms_MY, rn_BI_#Latn, ta_LK, tg_TJ, vun_TZ_#Latn, es_EC, mk_MK_#Cyrl, ff_CM_#Adlm, lg_UG, ff_NE_#Latn, cgg_UG, pcm_NG, en_BI, mi_NZ, ar_ER, es_EA, fr_SC, en_SL, ff_NG_#Latn, ff_NG_#Adlm, en_SH, eo_001, en_SI, vai_LR_#Vaii, rof_TZ_#Latn, ar_LB, ff_GN, eo_001_#Latn, hr_HR, rof_TZ, mn_MN, en_FM, fr_WF, ff_GM_#Latn, teo_UG_#Latn, asa_TZ_#Latn, bez_TZ, ff_GN_#Latn, sl_SI_#Latn, en_FK, bas_CM_#Latn, en_DG, pt_ST, ak_GH, es_419, ln_CD_#Latn, kkj_CM_#Latn, es_IC, ar_TN, bm_ML, jmc_TZ_#Latn, khq_ML, en_SB, rw_RW, shi_MA_#Tfng, ro_MD, uz_UZ, ia_001_#Latn, en_SC, en_UG, en_NZ, es_UY, ru_UA, sg_CF, en_BB, hr_BA, yo_NG_#Latn, lu_CD, ar_001, so_SO, lv_LV, sr_RS_#Cyrl, en_LS, ka_GE, sw_TZ, fr_RW, mg_MG, sr_RS_#Latn, ky_KG, tzm_MA_#Latn, ku_TR_#Latn, mfe_MU_#Latn, ky_KG_#Cyrl, qu_EC, ka_GE_#Geor, en_MS, kde_TZ_#Latn, sr_ME, en_ZM, fr_ML, ha_NG, os_GE, yi_001, en_GH, tzm_MA, ses_ML, rwk_TZ_#Latn, vai_LR_#Latn, sw_CD, ff_MR_#Adlm, en_VC, ses_ML_#Latn, en_150, ha_NE, en_KN, ro_RO, sr_ME_#Latn, ff_LR_#Latn, bas_CM, fr_MG, es_CL, sq_AL, ro_RO_#Latn, twq_NE, nmg_CM, en_MP, en_GD, sbp_TZ_#Latn, kde_TZ, ta_MY, si_LK_#Sinh, en_KI, twq_NE_#Latn, sq_AL_#Latn, ff_GH_#Adlm, fr_MF, en_SZ, rwk_TZ, kk_KZ, ar_PS, kkj_CM, es_GQ, en_SX, ru_KZ, ko_KP, nl_SR, bem_ZM_#Latn, cgg_UG_#Latn, nl_BQ, ee_GH_#Latn, ff_GN_#Adlm, uz_UZ_#Cyrl, asa_TZ, fr_SN, fr_MA, ff_GM_#Adlm, fr_BL, mgo_CM, nmg_CM_#Latn, tg_TJ_#Cyrl, en_SS, shi_MA, en_MG, fr_BI, naq_NA_#Latn, fr_BJ, vai_LR, bs_BA_#Cyrl, khq_ML_#Latn, mn_MN_#Cyrl, wo_SN, ha_NG_#Latn, fr_HT, nl_SX, fr_CG, ms_MY_#Latn, zgh_MA_#Tfng, nyn_UG_#Latn, en_VU, to_TO, ff_SL_#Latn, xog_UG_#Latn, ff_SN_#Adlm, vi_VN_#Latn, jgo_CM_#Latn, zgh_MA, uk_UA, lg_UG_#Latn, en_NF, sr_XK_#Cyrl, ar_SS, nl_AW, en_AI, xog_UG, en_CM, ru_MD, ff_SN_#Latn, en_TO, ff_SL_#Adlm, en_PG, fr_CF, pt_TL, en_ER, sr_BA, be_BY_#Cyrl, fr_TG, sr_XK_#Latn, ig_NG, fr_GN, en_CK, ar_MA, fr_TD, bem_ZM, ewo_CM_#Latn, ewo_CM, fr_CD, rn_BI, en_NA, mgo_CM_#Latn, lag_TZ, qu_BO, kea_CV_#Latn, sq_XK, mi_NZ_#Latn, en_KY, si_LK, ar_SO, fr_MU, en_TK, mua_CM, pt_GW, ee_TG, ln_AO, be_BY, pt_CV, ru_BY, ee_GH, kk_KZ_#Cyrl, yo_BJ, fr_KM, es_AR, en_MY, sbp_TZ, hy_AM, en_GM, ksb_TZ_#Latn, pt_AO, en_001, dua_CM_#Latn, lag_TZ_#Latn, ru_KG, fr_MR, ksf_CM_#Latn, ff_BF_#Latn, en_MW, naq_NA, en_IO, en_CC, az_AZ_#Cyrl, shi_MA_#Latn, es_CU, ig_NG_#Latn, yav_CM, da_GL, wo_SN_#Latn, es_CR, fr_GA, en_MU, az_AZ_#Latn, dyo_SN_#Latn, en_VG, en_TC, af_NA, mas_TZ, ms_BN],
WeekFields[SATURDAY,1]=[ar_EG, ps_AF_#Arab, ar_SY, uz_AF, lrc_IR, ar_OM, lrc_IQ, ar_DZ, fa_IR_#Arab, fr_DJ, so_DJ, lrc_IR_#Arab, ar_AE, mzn_IR, en_SD, uz_AF_#Arab, ar_IQ, ar_KW, ar_JO, fr_DZ, fa_AF, ckb_IQ_#Arab, ar_SD, fa_IR, kab_DZ_#Latn, kab_DZ, ps_AF, mzn_IR_#Arab, en_AE, ar_BH, ar_QA, ar_EG_#Arab, ckb_IQ, ckb_IR, ar_LY, fr_SY, ar_DJ],
WeekFields[MONDAY,4]=[se_NO_#Latn, dsb_DE, lb_LU_#Latn, se_NO, pl_PL, nds_DE, nb_SJ, lb_LU, dsb_DE_#Latn, is_IS_#Latn, no_NO_NY, pl_PL_#Latn, nds_DE_#Latn, tt_RU, fur_IT_#Latn, ast_ES_#Latn, en_JE, da_DK_#Latn, en_AT, gd_GB, wae_CH_#Latn, no_NO_#Latn, smn_FI_#Latn, en_NL, gsw_FR, hu_HU, bg_BG_#Cyrl, et_EE, fy_NL, de_IT, de_CH, nl_NL, pt_CH, gv_IM, kw_GB_#Latn, fi_FI_#Latn, fr_BE, nb_NO, it_SM, fi_FI, ca_FR, de_BE, de_DE_#Latn, fr_FR_#Latn, ksh_DE, ru_RU, ga_IE, rm_CH_#Latn, fr_LU, ga_GB, no_NO, de_LU, de_DE, nn_NO_#Latn, en_DK, lt_LT, ksh_DE_#Latn, da_DK, en_BE, tt_RU_#Cyrl, ga_IE_#Latn, is_IS, en_SE, gsw_LI, kw_GB, en_DE, en_FI, sah_RU_#Cyrl, en_FJ, de_LI, smn_FI, de_AT, ce_RU, os_RU, nl_NL_#Latn, gl_ES_#Latn, en_GG, sv_SE, el_GR_#Grek, it_VA, es_ES, bg_BG, hsb_DE, eu_ES_#Latn, sv_SE_#Latn, sv_FI, en_IE, fo_FO_#Latn, en_GB, fr_MC, ce_RU_#Cyrl, gsw_CH, pt_LU, hsb_DE_#Latn, br_FR_#Latn, es_ES_#Latn, cy_GB_#Latn, fr_FR, sah_RU, sk_SK, ru_RU_#Cyrl, gv_IM_#Latn, nds_NL, fr_RE, fr_GP, fr_CH, nb_NO_#Latn, fy_NL_#Latn, cs_CZ, ca_ES, hu_HU_#Latn, rm_CH, et_EE_#Latn, gd_GB_#Latn, se_FI, lt_LT_#Latn, ca_IT, ca_AD, it_CH, it_IT, nn_NO, se_SE, it_IT_#Latn, wae_CH, fo_DK, en_CH, fo_FO, ast_ES, fr_MQ, fur_IT, fr_GF, sk_SK_#Latn, eu_ES, el_GR, ca_ES_VALENCIA, gl_ES, en_IM, gsw_CH_#Latn, en_GI, ca_ES_#Latn, nl_BE, cy_GB, sv_AX, cs_CZ_#Latn, br_FR],
WeekFields[SUNDAY,1]=[, he, th_TH_#Thai, nds, ti_ET, ta_SG, lv, zh_SG_#Hans, en_JM, kkj, sd__#Arab, dz_BT, mni, yi, cs, el, af, smn, dsb, khq, ne_IN, es_US, sa, en_US_POSIX, pt_MO, zh__#Hans, so_KE, gu_IN_#Gujr, teo, eu, es_DO, ru, az, su__#Latn, fa, nd, kk, hy, en_AU, ksb, luo, lb, su, no, ar_IL, mgh, or_IN, az__#Latn, ta, lag, luo_KE_#Latn, bo, om_KE, en_AS, zh_TW, sd_IN, kln, mai, pt_MZ, my_MM_#Mymr, gl, sr__#Cyrl, yue_CN_#Hans, ff__#Adlm, kn_IN, ga, qu, en_PR, mua, jv, ps, sn, km, zgh, es, jgo, gsw, pa_IN_#Guru, ur_PK_#Arab, ceb, bn_BD_#Beng, ne_NP_#Deva, te, sl, mr_IN, ha, guz_KE_#Latn, es_HN, sbp, sw, nmg, pt_BR_#Latn, vai__#Vaii, gu, lo, zh_HK_#Hans, bs__#Latn, os, am, ki_KE, en_PK, zh_CN, rw, brx_IN, en_TT, dav, ses, xh_ZA, es_VE, mer_KE, mg, mr, seh, mgo, en_US, pa__#Guru, sa_IN_#Deva, gu_IN, ast, mt_MT_#Latn, yue__#Hans, ccp_BD_#Cakm, ks__#Arab, af_ZA_#Latn, ti_ET_#Ethi, am_ET_#Ethi, cgg, zh_MO, ksf, cy, ceb_PH, sq, fr, qu_PE, de, zu_ZA, su_ID_#Latn, lg, en_DM, sd, he_IL_#Hebr, yue_CN, en_WS, so, kab, nus, sn_ZW, th_TH_TH_#u-nu-thai, hi, zh_MO_#Hant, vai, sd_PK_#Arab, mi, mt, yav, kam, ro, ps_PK, ee, en_UM, lo_LA, chr, af_ZA, doi, es_BZ, as, it, ks_IN, my_MM, ur_PK, ii, naq, en_SG, kln_KE, tzm, fur, om, mai_IN_#Deva, ja_JP_JP_#u-ca-japanese, es_SV, pt_BR, mni_IN_#Beng, ml_IN, hr, lt, ccp, zh_CN_#Hans, en, guz_KE, ccp_BD, ca, pa_PK, ug_CN, ki_KE_#Latn, es_BR, bo_CN_#Tibt, chr_US, nyn, mk, sat, pa__#Arab, bs, fy, th, dav_KE, dje, mas_KE, mni_IN, ckb, bem, da, wae, ig, en_HK, brx_IN_#Deva, mer_KE_#Latn, en_US_#Latn, ki, nb, kok, ewo, nn, bg, kea, zu, am_ET, bo_CN, hsb, kok_IN_#Deva, sat_IN, pcm, sah, mer, br, ar_SA, fil_PH_#Latn, sk, om_ET_#Latn, ml, en_MT, en_IL, sv, kn_IN_#Knda, lkt_US, sd__#Deva, ku, fil_PH, es_PH, es_CO, agq, ebu, es_GT, nd_ZW_#Latn, mn, kam_KE, en_MO, ja_JP_#Jpan, wo, shi__#Tfng, en_BZ, lkt_US_#Latn, ta_IN_#Taml, az__#Cyrl, tk, shi__#Latn, en_BW, he_IL, nd_ZW, luy_KE_#Latn, mni__#Beng, ne, zh_SG, om_ET, lo_LA_#Laoo, ja_JP, kam_KE_#Latn, my, ka, ko_KR_#Kore, ms_ID, shi, kl, sa_IN, yue_HK, id, zh, es_PE, mgh_MZ, saq, zh_HK_#Hant, sat_IN_#Olck, es_PA, bez, kw, vai__#Latn, ksh, ur_IN, ln, luy_KE, pt, mgh_MZ_#Latn, ar_YE, to, et, rof, en_BS, be, gv, kln_KE_#Latn, dua, hi_IN_#Deva, guz, en_KE, mfe, ja, or, brx, mai_IN, ko_KR, es_MX, zu_ZA_#Latn, doi_IN, fi, uz, bs__#Cyrl, sr__#Latn, bo_IN, rm, bn, kn, nnh, bn_BD, en_ZA, pa_IN, en_MH, zh__#Hant, jv_ID_#Latn, ky, mas, xh_ZA_#Latn, dav_KE_#Latn, xh, te_IN, mas_KE_#Latn, lrc, ce, mt_MT, ko, ml_IN_#Mlym, ak, kde, dz, ia, seh_MZ, su_ID, ii_CN, pa_PK_#Arab, bn_IN, pa, rwk, rn, tg, hu, ceb_PH_#Latn, twq, bm, en_GU, tr, es_PY, kok_IN, dz_BT_#Tibt, en_PH, zh_MO_#Hans, sat__#Olck, ff, haw_US_#Latn, en_AG, ebu_KE, xog, ms, ug, qu_PE_#Latn, id_ID, teo_KE, haw_US, vi, fr_CA, dyo, luo_KE, eo, en_ZW, pl, ur, uz__#Arab, saq_KE, se, sn_ZW_#Latn, ms_SG, yue__#Hant, km_KH_#Khmr, luy, uk, es_PR, mzn, tt, ug_CN_#Arab, hi_IN, saq_KE_#Latn, asa, ff__#Latn, doi_IN_#Deva, ebu_KE_#Latn, uz__#Cyrl, fil, yue_HK_#Hant, fo, ne_NP, ta_IN, lkt, id_ID_#Latn, is, te_IN_#Telu, si, jv_ID, ks, zh_TW_#Hant, as_IN, zh_HK, sw_KE, th_TH, as_IN_#Beng, jmc, yue, ar, en_VI, haw, bas, uz__#Latn, sg, km_KH, nl, ks_IN_#Arab, sd_IN_#Deva, mr_IN_#Deva, sr, seh_MZ_#Latn, en_CA, gd, chr_US_#Cher, or_IN_#Orya, so_ET, vun, en_IN, lu, yo, es_NI, ii_CN_#Yiii, sd_PK, ti, ccp_IN],
WeekFields[SUNDAY,4]=[pt_PT]}
于 2022-01-09T10:55:13.507 回答
0

我没有从其他答案中完全清楚地看到它,所以请允许我试一试。

基于周的年份或有时是周年份简称为相关周数所属的年份。因此,例如,第 1 周的所有日子都具有相同的基于周的年份,即使该周的某些部分位于前一个日历年。或者反过来说,假设一年中的第 52 周延伸到下一年(这对于某些而非所有周编号方案来说是可能的),那么该周的每一天都将旧日历年作为其基于周的年份。我住的地方,2020 年的第 1 周是从 12 月 30 日星期一到 1 月 5 日星期日(含)。因此,对于截至 12 月 29 日的日子,日历年和基于周的年同意为 2019 年。12 月 30 日和 31 日有基于周的 2020 年,但当然仍然是 2019 年。从 1 月 1 日起日历年和基于周的年再次同意,现在是 2020 年。

因此,基于周的年份除了与周数一起使用之外几乎没有任何意义。

有点复杂的地方(我认为其他答案不太清楚)是周编号取决于区域设置,因此基于周的年份也是如此。ADateTimeFormatter有一个语言环境,并使用该语言环境来选择周编号方案,以便在决定给定日期的基于周的年份时使用。

为了说明,我在三个不同的语言环境中格式化 2022 年新年前后的 10 天:

  1. 我想展示 ISO 8601 周并选择法国作为遵循 ISO 的国家
  2. 美国的星期从星期日开始
  3. 在许多阿拉伯国家,新的一周从星期六开始;我以摩洛哥为例

我的代码:

    DateTimeFormatter iso
            = DateTimeFormatter.ofPattern("Y w E", Locale.FRANCE);
    DateTimeFormatter us
            = DateTimeFormatter.ofPattern("Y w E", Locale.US);
    DateTimeFormatter arabic = DateTimeFormatter
            .ofPattern("Y w E", Locale.forLanguageTag("ar-MA"));
    
    System.out.println("                ISO           US          Morocco");
    LocalDate d = LocalDate.of(2021, Month.DECEMBER, 25);
    for (int i = 0; i < 10; i++) {
        System.out.format("%-10s  %-12s  %-11s  %s%n",
                d, d.format(iso), d.format(us), d.format(arabic));
        d = d.plusDays(1);
    }

输出:

                ISO           US          Morocco
2021-12-25  2021 51 sam.  2021 52 Sat  2021 53 السبت
2021-12-26  2021 51 dim.  2022 1 Sun   2021 53 الأحد
2021-12-27  2021 52 lun.  2022 1 Mon   2021 53 الاثنين
2021-12-28  2021 52 mar.  2022 1 Tue   2021 53 الثلاثاء
2021-12-29  2021 52 mer.  2022 1 Wed   2021 53 الأربعاء
2021-12-30  2021 52 jeu.  2022 1 Thu   2021 53 الخميس
2021-12-31  2021 52 ven.  2022 1 Fri   2021 53 الجمعة
2022-01-01  2021 52 sam.  2022 1 Sat   2022 1 السبت
2022-01-02  2021 52 dim.  2022 2 Sun   2022 1 الأحد
2022-01-03  2022 1 lun.   2022 2 Mon   2022 1 الاثنين

观察;

  • 在所有三列中,周年在第 1 周开始的同一天发生变化。
  • 这种变化发生在三个地区的不同日期:
    1. 在美国,以周为单位的 2022 年从 2021 年的圣斯蒂芬节开始。
    2. 在摩洛哥,基于周的 2022 年恰好从 2022 日历年的第一天开始,但这只是因为 2022 年那一天是星期六,因此是一周的第一天。
    3. 在 ISO 8601 中,基于周的 2022 年直到 1 月 3 日才开始。

为了完整起见:定义周编号有两个部分:

  1. 新的一周从星期几开始
  2. 一周必须包括多少天才能成为第一周。这称为第一周的最少天数。.

在美国和摩洛哥,第 1 周被定义为包含 1 月 1 日的那一周。换句话说,一周只需要在新年中至少有 1 天才能成为该新年的第 1 周。在 ISO 中并非如此。您会看到法国的 1 月 1 日属于旧年的第 52 周。这里一周属于其大部分日子所在的年份(因为一周有 7 天,奇数,永远不会有平局)。换句话说,一周必须在新年中至少有 4(四)天才能成为第 1 周。

于 2020-07-01T21:30:57.103 回答