【问题标题】:Get preferred date format string of Android system获取Android系统首选日期格式字符串
【发布时间】:2012-02-10 22:52:00
【问题描述】:

有人知道如何在使用格式化日期时获取系统使用的格式字符串

DateFormat.getLongDateFormat(Context context).format(Date date)

【问题讨论】:

  • 请选择另一个答案作为接受的答案。当前一个是 hack(正如回答的人所指出的那样)。

标签: android


【解决方案1】:

要获取日期格式模式,您可以这样做:

Format dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();

【讨论】:

  • 也为我工作过,但是否可以从中获取日期和时间格式?
  • 同时获取时间实例。我们怎么能忽略它呢?当前:2020年5月18日12:00:00 需要:2020年5月18日
【解决方案2】:

我写了一个方法来检测这个格式字符串。 (为我的情况工作)。

public static String getDateFormat(Context context){
        // 25/12/2013
        Calendar testDate = Calendar.getInstance();
        testDate.set(Calendar.YEAR, 2013);
        testDate.set(Calendar.MONTH, Calendar.DECEMBER);
        testDate.set(Calendar.DAY_OF_MONTH, 25);

        Format format = android.text.format.DateFormat.getDateFormat(context);
        String testDateFormat = format.format(testDate.getTime());
        String[] parts = testDateFormat.split("/");
        StringBuilder sb = new StringBuilder();
        for(String s : parts){
            if(s.equals("25")){
                sb.append("dd/");
            }
            if(s.equals("12")){
                sb.append("MM/");
            }
            if(s.equals("2013")){
                sb.append("yyyy/");
            }
        }
        return sb.toString().substring(0, sb.toString().length()-1);
    }

编辑请查看以下 Mark Melling 的回答 https://stackoverflow.com/a/18982842/945808 以获得更好的解决方案。我的只是很久以前的黑客攻击。

【讨论】:

  • 这仅适用于使用/ 分割日期的区域设置,.- 用于该区域设置
  • @draksia 然后请检查 Mark Melling stackoverflow.com/a/18982842/945808的稍后答案
  • 是的,我确实需要它用于特定的语言环境,我今天取得了一些进展,希望它可以工作
  • 太好了,我希望这个问题的作者可以将接受的答案更改为 Mark Melling 的答案。我当时的回答只是一个hack。
  • @VladMatvienko 它是!正如我在编辑中所说,请检查下面标记的答案
【解决方案3】:

API 中有一个静态方法,您可以这样调用:

Format dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());

还有更多关于它的讨论here

【讨论】:

  • 那个 dateFormat 对象有一个名为 pattern 的私有字段,这正是我正在寻找的。但它是私有的,没有获取它的方法。我怎样才能在没有反射的情况下得到它?
【解决方案4】:

你可以用这个:

private static DateFormat mDateFormat;
private static DateFormat mTimeFormat;

mDateFormat = android.text.format.DateFormat.getDateFormat(this);
mTimeFormat = android.text.format.DateFormat.getTimeFormat(this);

public static String getSystemDateFormat() {
    return ((SimpleDateFormat) mDateFormat).toPattern();
}

public static String getSystemTimeFormat() {
    return ((SimpleDateFormat) mTimeFormat).toPattern();
}

public static String getSystemDateTimeFormat() {
    return getSystemDateFormat() + " " + getSystemTimeFormat();
}

【讨论】:

    【解决方案5】:

    根据上面的答案:

    String pattern = Settings.System.getString(getActivity().getContentResolver(),
    Settings.System.DATE_FORMAT);
                    String format;
                    if (pattern.indexOf("d")<pattern.indexOf("M"))
                        format = "d/M";
                    else
                        format = "M/d";
                    SimpleDateFormat df = new SimpleDateFormat(format);
    

    然后使用 SimpleDateFormat 格式化您的 Date 对象。它对我有用。

    【讨论】:

      【解决方案6】:

      SimpleDateFormat

      我使用 SimpleDateFormat 没有自定义模式从系统中获取首选格式的实际日期和时间:

      public static String getFormattedDate() {
          Calendar c = Calendar.getInstance();
          SimpleDateFormat df = new SimpleDateFormat(); //called without pattern
          return df.format(c.getTime());
      }
      

      返回

      • 13.01.15 11:45
      • 2015 年 1 月 13 日上午 10:45
      • ...

      【讨论】:

      • 这在我的设备上不起作用,即使我更改了设置中的时间格式...
      【解决方案7】:

      根据DateFormat 文档:

      要格式化当前区域设置的日期,请使用静态工厂之一 方法:

      myString = DateFormat.getDateInstance().format(myDate);
      

      并将其格式化为不同的语言环境:

      myString = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE).format(myDate);
      

      【讨论】:

      • 似乎是我的问题被误解了。我需要的是获取调用 DateFormat.getLongDateFormat(Context context).format(Date date) 时系统使用的当前日期格式字符串。我不需要格式化的日期字符串。我需要的是格式字符串本身。像“mm/dd/yyyy”或系统根据设备上设置的区域设置使用的任何一个。谢谢。
      • 在 Android 中不可能。对于 DateFormat 类型,方法 getDateInstance() 未定义。
      • 导致 java.lang.IllegalArgumentException:错误类:类 java.util.GregorianCalendar
      • 有谁知道如何获得像 yyyy-MM-dd 这样的实际模式?
      【解决方案8】:
      String shortDateFormat  = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT);
      

      【讨论】:

      • 我的系统设置为返回 dd/MM/yyyy,这给了我 dd-MM-YYYY - 所以不是正确的分隔符。但是,Mark Melling 上面的答案确实返回了正确的系统模式。
      • 从文档中获得:android dev。无论如何,Mark Melling 在上面的回答 - 更好的解决方案。
      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多