Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Android 不同的日期格式_Android_Date_Simpledateformat_Date Format - Fatal编程技术网

Android 不同的日期格式

Android 不同的日期格式,android,date,simpledateformat,date-format,Android,Date,Simpledateformat,Date Format,我在Android应用程序中转换日期时遇到问题。 我的问题是我有两种不同的日期格式 SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); DateFormat formatter_date = new SimpleDateFormat("dd.MMM.yyyy"); Date myDate = null; try { myDate = dateFormat.parse("28.10.2015"); } catc

我在Android应用程序中转换日期时遇到问题。 我的问题是我有两种不同的日期格式

SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
DateFormat formatter_date = new SimpleDateFormat("dd.MMM.yyyy");
Date myDate = null;
try {
    myDate = dateFormat.parse("28.10.2015");
} catch (ParseException e) {
    e.printStackTrace();
}
formatter_date.format(myDate,"dd.MM.yyyy"))
txtDate.setText(formatter_date.format(myDate,"dd.MM.yyyy")));
我想在设备上设置日期格式为2015年10月28日,设置为英语,设置为2015年10月28日,设置为德语,等等。因此,在月份缩写前后始终有一个点。当language设置为English时,返回2015年10月28日,但当language设置为German时,返回2015年10月28日,在Okt和2015之间有两个点

有什么解决办法吗

SimpleDateFormat dateFormat = new SimpleDateFormat(String pattern, Locale locale);
另一个构造函数具有
Locale
change Locale.ENGLISH以将日期设置为英语。您可以检查其他区域设置选项。我通常使用Locale.getDefault()以用户喜欢的语言显示日期


另一个构造函数具有
Locale
change Locale.ENGLISH以将日期设置为英语。您可以检查其他区域设置选项。我通常使用Locale.getDefault()以用户喜欢的语言显示日期。

谢谢您的帮助,但此解决方案最适合我

 DateFormat formatter_month = new SimpleDateFormat("MMMM"); //Get Whole Name of Month
 DateFormat formatter_day = new SimpleDateFormat("dd."); //Get Day + Dot(2 digits)
 DateFormat formatter_year = new SimpleDateFormat(".yyyy"); //Get Dot + Year(4 digits)
 String str_date = formatter_day.format(date)+  //Day
 formatter_month.format(date).substring(0,3)+   //Month
 formatter_year.format(date);   //Year

谢谢你的帮助,但这个解决方案最适合我

 DateFormat formatter_month = new SimpleDateFormat("MMMM"); //Get Whole Name of Month
 DateFormat formatter_day = new SimpleDateFormat("dd."); //Get Day + Dot(2 digits)
 DateFormat formatter_year = new SimpleDateFormat(".yyyy"); //Get Dot + Year(4 digits)
 String str_date = formatter_day.format(date)+  //Day
 formatter_month.format(date).substring(0,3)+   //Month
 formatter_year.format(date);   //Year

我想挑战你的要求。当然,你可以拥有它,正如你自己的答案已经表明的那样。但是你想要吗

使用内置的本地化格式 Java为所有可用的语言环境提供了本地化格式(我认为这就是全部,在任何情况下都是很多)。我建议你使用这些,而不是你自己的想法,本地化日期应该是什么样子。虽然2015年8月28日在奥地利和其他德语国家可能很常见,但英语国家的人不习惯你的格式中的点,我怀疑世界上的一些人会或多或少觉得奇怪

我在一篇评论中建议您将ThreeTenABP添加到Android项目中,以便使用现代java日期和时间API
java.time
。和你一起工作真是太好了。现在我正在吃我自己的药:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
    LocalDate myDate = LocalDate.of(2015, Month.OCTOBER, 28);
    System.out.println(myDate.format(dateFormatter));
不同地区的输出包括:

German:     28.10.2015
UK English: 28 Oct 2015
French:     28 oct. 2015
这不是你要的。您可能会遇到反对意见,但无论您选择哪种格式,这种情况都会发生,因为许多人对其区域设置的正确格式有自己的想法。这是非常标准化的,所以考虑一下。

编辑:LocalDate来自哪里? 我知道您正在从一个字符串转换,如
“28.10.2015”
。如果您知道如何将其转换为
LocalDate
,则很简单:

    DateTimeFormatter numericDateFormatter = DateTimeFormatter.ofPattern("dd.MM.uuuu");
    LocalDate myDate = LocalDate.parse("28.10.2015", numericDateFormatter);
只有当您从一个旧API获得了一个
java.util.Date
,而您现在无法更改或不想更改该API时,首先将其转换为现代
即时
类型,并从中进行进一步转换:

    LocalDate myDate = oldfashionedJavaUtilDate.toInstant()
            .atZone(ZoneId.of("Europe/Vienna"))
            .toLocalDate();
由于这是一个时区敏感的操作,我建议您指定一个明确的时区。您可以通过指定
ZoneId.systemDefault()
来使用JVM的时区设置,但请注意这是脆弱的:JVM设置可能会被程序的其他部分或在同一JVM中运行的其他程序更改

你要什么 您所要求的
java.time
版本与您自己答案中的代码非常相似:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd");
    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM");
    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("uuuu");
    LocalDate myDate = LocalDate.of(2015, Month.OCTOBER, 28);
    String dayOfMonth = myDate.format(dateFormatter);
    String monthName = myDate.format(monthFormatter);
    if (monthName.length() > 3) {
        monthName = monthName.substring(0, 3);
    }
    String year = myDate.format(yearFormatter);
    String formattedDate = dayOfMonth + '.' + monthName + '.' + year;
    System.out.println(formattedDate);
在与上述相同的语言环境中输出:

German:     28.Okt.2015
UK English: 28.Oct.2015
French:     28.oct.2015
但是,要获得相同的结果,有一种更短的方法:

    String formattedDate = String.format("%1$td.%2$.3s.%1$tY", 
            myDate,
            myDate.getMonth().getDisplayName(TextStyle.FULL, Locale.getDefault()));
它更难读。我花了多次尝试才使格式字符串
%1$td.%2$.3s.%1$tY
完全正确。如果维护您的代码的人习惯于格式化日期(和时间)的
DateTimeFormatter
,这会让他们感到惊讶。所以我并不推荐它,但选择权在你

在另一个日期,我得到了以下法语语言环境的输出:

08.jui.2018
不会说法语的人,也不会有其他人知道这个日期是六月(朱因)还是七月(朱伊莱)。在JVM中的57个可用区域中,一年中的所有12个月都以相同的三个字母开始。这些地区包括藏语、斯瓦希里语、索马里语、康沃尔语、苏格兰盖尔语和越南语。在这些语言中,没有人能够分辨出任何月份。请三思

链接
  • ,解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

    • 我想挑战你的要求。当然,你可以拥有它,正如你自己的答案已经表明的那样。但是你想要吗

      使用内置的本地化格式 Java为所有可用的语言环境提供了本地化格式(我认为这就是全部,在任何情况下都是很多)。我建议你使用这些,而不是你自己的想法,本地化日期应该是什么样子。虽然2015年8月28日在奥地利和其他德语国家可能很常见,但英语国家的人不习惯你的格式中的点,我怀疑世界上的一些人会或多或少觉得奇怪

      我在一篇评论中建议您将ThreeTenABP添加到Android项目中,以便使用现代java日期和时间API
      java.time
      。和你一起工作真是太好了。现在我正在吃我自己的药:

          DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
          LocalDate myDate = LocalDate.of(2015, Month.OCTOBER, 28);
          System.out.println(myDate.format(dateFormatter));
      
      不同地区的输出包括:

      German:     28.10.2015
      UK English: 28 Oct 2015
      French:     28 oct. 2015
      
      这不是你要的。您可能会遇到反对意见,但无论您选择哪种格式,这种情况都会发生,因为许多人对其区域设置的正确格式有自己的想法。这是非常标准化的,所以考虑一下。

      编辑:LocalDate来自哪里? 我知道您正在从一个字符串转换,如
      “28.10.2015”
      。如果您知道如何将其转换为
      LocalDate
      ,则很简单:

          DateTimeFormatter numericDateFormatter = DateTimeFormatter.ofPattern("dd.MM.uuuu");
          LocalDate myDate = LocalDate.parse("28.10.2015", numericDateFormatter);
      
      只有当您从一个旧API获得了一个
      java.util.Date
      ,而您现在无法更改或不想更改该API时,首先将其转换为现代
      即时
      类型,并从中进行进一步转换:

          LocalDate myDate = oldfashionedJavaUtilDate.toInstant()
                  .atZone(ZoneId.of("Europe/Vienna"))
                  .toLocalDate();