Java中的本地化日期格式

Java中的本地化日期格式,java,datetime-format,Java,Datetime Format,我有一个以毫秒为单位的时间戳,并希望将其格式化,以分钟为精度指示日、月、年和小时 我知道我可以指定如下格式: SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy HH:mm"); String formatted = simpleDateFormat.format(900000) SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy HH:mm", Local

我有一个以毫秒为单位的时间戳,并希望将其格式化,以分钟为精度指示日、月、年和小时

我知道我可以指定如下格式:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy HH:mm");
String formatted = simpleDateFormat.format(900000)
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy HH:mm", Locale.getDefault());
String formatted = sdf .format(900000);
System.out.println(simpleDateFormat.parse(formatted));
但是我希望该格式能够根据用户的区域设置进行本地化。我也试过了

DateFormat DATE_FORMAT = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
DATE_FORMAT.format(new Date());

但它没有显示时间。我怎么做

您可以使用
DateFormat
的方法
getDateTimeInstance
。这里,
getDateTimeInstance
方法接受3个参数

  • 日期字段的样式
  • 时间场的风格
  • 自动提取模式所使用的区域设置

    DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US);
    System.out.println(DATE_FORMAT.format(d));
    DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.FRENCH);
    System.out.println(DATE_FORMAT.format(d));
    

  • 试试这样的东西

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy HH:mm", Locale.getDefault());
        String formatted = simpleDateFormat.format(900000);
        System.out.println(simpleDateFormat.parse(formatted));
    
    使用joda time()是不可能的吗?如果不是,那么我会全心全意地推荐使用这个很棒的库,而不是繁琐的JavaAPI

    如果没有,您可以使用
    DateFormat.getDateTimeInstance(int,int,Locale)

    第一个int是小时的样式,另一个是时间的样式,请尝试使用:

    DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault());
    String formattedDate = f.format(new Date());
    System.out.println("Date: " + formattedDate);
    
    看看这是否适合你

    Locale.GERMANY的输出: 日期:25.07.13 10:57

    Locale.US的输出:
    日期:7/25/13上午10:57

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yy HH:mm");
    String formatted = simpleDateFormat.format(900000)
    
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy HH:mm", Locale.getDefault());
    String formatted = sdf .format(900000);
    System.out.println(simpleDateFormat.parse(formatted));
    
    但它不显示小时。我该怎么做?

    您必须调用
    DateFormat.getDateTimeInstance(int,int,Locale)

    DateFormat.getDateInstance(int,Locale)
    =>获取具有给定区域设置的给定格式样式的日期格式化程序

    DateFormat.getDateTimeInstance(int,int,Locale)
    =>获取具有给定区域设置的给定格式样式的日期/时间格式化程序。

    使用可以检测系统设置并使用不同的时间格式:

    String format;
    
    if (DateFormat.is24HourFormat(context)) {
      format = "MM/dd/yy, hh:mm";
    }
    else {
      format = "MM/dd/yy, h:mm aa";
    }
    
    DateTimeFormatter formatter = DateTimeFormat.forPattern(format);
    formatter.print(new DateTime());
    
    java.time 旧式日期时间API(
    java.util
    date-time类型及其格式化API,
    SimpleDateFormat
    )已过时且容易出错。建议完全停止使用它,并切换到
    java.time
    ,即*

    您可以使用获取ISO年表的特定于区域设置的日期格式

    演示:

    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.format.FormatStyle;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            DateTimeFormatter dtfLocalized = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT);
            // Test
            LocalDateTime date = LocalDateTime.now();
    
            System.out.println(dtfLocalized.withLocale(Locale.US).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.UK).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.CHINESE).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.GERMAN).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.forLanguageTag("tr")).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.getDefault()).format(date));
        }
    }
    
    5/8/21, 10:49 PM
    08/05/2021, 22:49
    2021/5/8 下午10:49
    08.05.21, 22:49
    8.05.2021 22:49
    08/05/2021, 22:49
    
    输出:

    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.format.FormatStyle;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            DateTimeFormatter dtfLocalized = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT);
            // Test
            LocalDateTime date = LocalDateTime.now();
    
            System.out.println(dtfLocalized.withLocale(Locale.US).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.UK).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.CHINESE).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.GERMAN).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.forLanguageTag("tr")).format(date));
            System.out.println(dtfLocalized.withLocale(Locale.getDefault()).format(date));
        }
    }
    
    5/8/21, 10:49 PM
    08/05/2021, 22:49
    2021/5/8 下午10:49
    08.05.21, 22:49
    8.05.2021 22:49
    08/05/2021, 22:49
    
    了解有关*的更多信息


    *无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

    作为说明,似乎
    DateFormat.getDateTimeInstance(int,int)
    调用
    DateFormat.getDateTimeInstance(int,int,Locale)
    使用
    Locale.getDefault()
    无论如何,至少在当前版本的Android上是这样。如果使用Joda时间库,你会怎么做?