Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无年份的java本地时间格式_Java_Localization_Date Format - Fatal编程技术网

无年份的java本地时间格式

无年份的java本地时间格式,java,localization,date-format,Java,Localization,Date Format,我喜欢将本地时间格式格式化为不带年份的字符串。目前,我能够显示包含年份的本地格式: java.text.DateFormat df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT); String dateString = df.format(date); 因此,我收到一个时间字符串输出,如 12.03.2012 03/12/2012 对于不同的国家。现在我想要一个简短的表格,比如 12.03. 03/12

我喜欢将本地时间格式格式化为不带年份的字符串。目前,我能够显示包含年份的本地格式:

java.text.DateFormat df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT);
String dateString = df.format(date);
因此,我收到一个时间字符串输出,如

12.03.2012
03/12/2012
对于不同的国家。现在我想要一个简短的表格,比如

12.03.
03/12
我该怎么做


谢谢你的帮助

您可以使用
SimpleDataFormat

Date date = new Date();
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("MM/dd");
String dateString = df.format(date);
输出:

03/15
编辑:

在进一步研究了区域设置格式并扩展了Peters的答案之后,下面是一些代码,以演示
toPattern()
toLocalizedPattern()之间的差异:

总之,要显示不带年份的本地化日期:


String yearlessPattern=DateFormat.getDateInstance(DateFormat.SHORT).toPattern().replaceAll(“\\W?[Yy]+\\W?”,”)

没有预定义的格式来实现这一点。这里有一个解决方法:使用
java.text.DateFormat.SHORT
格式化日期,并使用格式为
yyy
的自定义格式化程序格式化日期。现在搜索前者的结果以查找后者

如果年份接近开始,请删除年份后的下一个非数字,否则请删除年份前的非数字

SimpleDateFormat df = (SimpleDateFormat)
                      DateFormat.getDateInstance(DateFormat.SHORT);
String pattern = df.toLocalizedPattern().replaceAll(".?[Yy].?", "");
System.out.println(pattern);
SimpleDateFormat mdf = new SimpleDateFormat(pattern);
但这也不完美,因为它给你的是“12.3”,而不是德语的“12.3”

如果您真的需要正确使用,请查看Java源代码,特别是
rt.jar
中的包
sun.text.resources
,并打印所有区域设置日期(您只需为所有区域设置创建一个
DateFormat
类型
SHORT


这将为您提供创建自己的资源包所需的所有数据,其中包含所有语言的日/月格式字符串。

您可以提取模式并删除年份

SimpleDateFormat df = (SimpleDateFormat)
                      DateFormat.getDateInstance(DateFormat.SHORT);
String pattern = df.toLocalizedPattern().replaceAll(".?[Yy].?", "");
System.out.println(pattern);
SimpleDateFormat mdf = new SimpleDateFormat(pattern);
印刷品

M/d

在我的系统中。

您可能已经意识到,短格式不仅取决于语言,还取决于国家。不幸的是,Java中没有内置这样的模式。相反,您可能需要使用-search定义的“模式”或“Md”(月/日模式)


但是,我必须警告您,这些模式可能有问题。相反,您可能希望将它们移动到资源文件中,让翻译人员处理它们(需要对它是什么以及如何处理进行适当的注释)。

我需要将日期转换为字符串删除年份。字符串应保留区域设置。日期格式的类型为
DateFormat.LONG
,而不是
DateFormat.SHORT
。例如,完整字符串是
2012年9月18日
,而不是
09/18/12

我的解决方案(基于post):

程序输出:

LocaleComplete datePatternYearless无日期无年份模式
日本2012/09/18yyyy/MM/dd09/18MM/dd
日本24.09.18Gy.MM.dd09.18MM.dd
美国2012年9月18日,2012年9月18日,YYYY年9月18日
2012年9月18日至2012年9月18日
美国2018年第18个月第22个月第18个月第28个月
乌克兰2018年12月至2008年12月
Spain18/setembre/2012d'/'毫米'/'yyyy18/setembred'/'毫米
俄罗斯18Сбббббббб2012Γ.d毫米yyyy′Γ'18Сбббббd毫米
中国2012年9月18日yyyy'年'我月'd'日'9月18日我月'd'日'
法国2012年9月18日毫米yyyy18年9月毫米
德国18。2012年9月22日。嗯,yyyy18。九月。嗯
瑞典2012年9月18日'den'd MM yyyyden 2012年9月18日'den'd MM

java.time.MonthDay
Java提供了一个类来表示这样的值,一个月和一个月中的一天,没有任何年份:

ISO 8601 如果调用,您将得到一个按照标准格式生成的字符串,
--MM-DD
。这是扩展格式,该标准还允许基本格式最小化分隔符的使用,
--MMDD
。参考:第5.2.1.3节(d)ISO 8601:2000标准隐含年份中一个月的特定日期

String output = md.toString();
--12-03

自定义格式 我建议尽可能使用标准格式。但如果必须使用其他格式,则可以在类中指定

12/03


time类提供了和的自动本地化。不幸的是,对月-日值没有这样的支持。因此,您必须为所需的本地化明确定义自己的自定义格式。有关替代方案,请参见。

其他作者已经正确认识到,Java平台无法为没有年份的月-日组合管理预定义的本地化格式模式,因此建议使用数据分析和regexp模式等复杂的解决方法

我已经基于最新的CLDR数据将这种格式模式嵌入到我的库中。例如:

AnnualDate now = SystemClock.inLocalView().now(AnnualDate.chronology());
System.out.println("xml-schema: " + now); // --09-23

ChronoFormatter<AnnualDate> fEnglishUS =
    ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.US, AnnualDate.chronology());
ChronoFormatter<AnnualDate> fFrench =
    ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.FRENCH, AnnualDate.chronology());
ChronoFormatter<AnnualDate> fGerman =
    ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.GERMAN, AnnualDate.chronology());
System.out.println("us: " + fEnglishUS.format(now)); // 9/23
System.out.println("french:  " + fFrench.format(now)); // 23/09
System.out.println("german:  " + fGerman.format(now)); // 23.9.
AnnualDate now=SystemClock.inLocalView().now(AnnualDate.chronoloy());
System.out.println(“xml模式:“+now”);//--09-23

ChronoFormatter也有这个功能,但API要复杂得多。

关于在设置为西班牙语区域设置的设备上使用
DateFormat.getDateInstance(DateFormat.LONG)
DateFormat.getDateInstance(DateFormat.FULL)
的说明

simpleDateFormat.toLocalizedPattern()
中输出文本文本的格式

在我所看到的情况下

(2021年1月15日西班牙语为2021年1月15日)

删除
y
和任何非单词字符将导致
java.lang.IllegalArgumentException:Unterminated quote
异常(因为最后一个
'de'
上的最后一个
'
将作为非单词字符删除)

因此,作为一个最差的解决方案,在我们的非年份格式化程序中,如果patern包含单引号char
,我们将删除所有文本。(使用reg-ex
pattern.replaceAll(“\\w+”,”)

我已经和其他一些当地人测试过了,它似乎是有效的。(德、甲、丙、英)

+1。有限公司
LocalDate ld = LocalDate.parse( "2012-12-03" );  // December 3rd.
MonthDay md = MonthDay.from( ld );
String output = md.toString();
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd" );
String output = md.format( f ); 
AnnualDate now = SystemClock.inLocalView().now(AnnualDate.chronology());
System.out.println("xml-schema: " + now); // --09-23

ChronoFormatter<AnnualDate> fEnglishUS =
    ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.US, AnnualDate.chronology());
ChronoFormatter<AnnualDate> fFrench =
    ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.FRENCH, AnnualDate.chronology());
ChronoFormatter<AnnualDate> fGerman =
    ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.GERMAN, AnnualDate.chronology());
System.out.println("us: " + fEnglishUS.format(now)); // 9/23
System.out.println("french:  " + fFrench.format(now)); // 23/09
System.out.println("german:  " + fGerman.format(now)); // 23.9.
d 'de' MMMM 'de' y