如何在Android中格式化日期和时间?


321

当具有年,月,日,小时和分钟时,如何根据设备配置日期和时间正确格式化?

Answers:


291

使用标准的Java DateFormat类。

例如,要显示当前日期和时间,请执行以下操作:

Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

您可以使用自己的值初始化Date对象,但是您应该知道构造函数已被弃用,并且您实际上应该使用Java Calendar对象。


42
这是android.text.format.DateFormat而不是java.text.DateFormat。
jamesh

4
Android IME非常典型的情况是,有两个类都声称给您提供了设置为默认语言环境的结果,但没有一个。因此,是的,不要忘了使用DateFormat的android.text.format版本(甚至都不会派生一个LOL的java.util)。
mxcl 2010年

22
请注意这一行:DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());返回的dateFormat类型java.text.DateFormat(且不是NOT android.text.format.DateFormat
Arye Rosenstein

2
@Harsha-为了解决这个问题,我链接了DateFormat的用法,因此我只需要引用Android类,因此没有任何模棱两可的类。最终字符串dateStr = DateFormat.getDateFormat(this).format(d); 您可以使用Android的format()方法,并具有(IMHO)清洁代码和一个更少的Object进行实例化。
杰里·布雷迪

23
此格式化程序仅包含日期,而不包括原始问题所述的时间。从同一个包,而不是使用DateUtils,看到stackoverflow.com/questions/2983920/...
ASMO Soinio

202

我认为android.text.format.DateFormat.getDateFormat(context)这让我感到困惑,因为此方法返回java.text.DateFormat而不是android.text.format.DateFormat--“。

因此,我使用以下片段代码以我的格式获取当前日期/时间。

android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

or

android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

另外,您可以使用其他格式。遵循DateFormat


21
有用,但问题是“根据设备配置”。对我而言,这意味着使用基于用户语言/国家/地区选择的格式,或者由用户直接选择的格式,而不是对格式选择进行硬编码。
克里斯·博伊尔

17
另外,别忘了hh:mm:ss给您01:00:00提供1 PM,您将需要使用它kk:mm:ss来获取13:00:00
dnet 2012年

2
@dnet k是一天中的小时(1-24),您不是指H一天中的小时(0-23),例如。HH:mm:ss?请参阅:developer.android.com/reference/java/text/SimpleDateFormat.html
Joony 2012年

1
@Joony不,java.text.SimpleDateFormat(您链接的内容和使用H时间在0-23范围内)和android.text.format.DateFormat(答案的内容和用途之间有区别)k在0-23范围小时)
DNET

@dnet测试后,您对没错k,但是文档中DateFormat明确指出格式字符串的规范文档,请参见SimpleDateFormat。 非常混乱。还是我错过了什么?
乔尼2012年

144

您可以使用DateFormat。结果取决于电话的默认语言环境,但是您也可以指定语言环境:

https://developer.android.com/reference/java/text/DateFormat.html

这是一个结果

DateFormat.getDateInstance().format(date)                                          

法国区域:11月3日。2017年

美国/本地语言环境:1952年1月12日


DateFormat.getDateInstance(DateFormat.SHORT).format(date)

FR语言环境:03/11/2017

美国/本地语言环境:12.13.52


DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)

法国区域:11月3日。2017年

美国/本地语言环境:1952年1月12日


DateFormat.getDateInstance(DateFormat.LONG).format(date)

法国:2017年11月3日

美国/本地语言环境:1952年1月12日


DateFormat.getDateInstance(DateFormat.FULL).format(date)

法国地区:vendredi 2017年11月3日

美国/本地语言环境:1952年4月12日,星期二


DateFormat.getDateTimeInstance().format(date)

法国区域:11月3日。2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

FR语言环境:03/11/2017 16:04


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)

FR地区:03/11/2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)

FR地区:03/11/2017 16:04:58 GMT + 01:00


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)

FR Locale:03/11/2017 16:04:58欧洲中央大学


DateFormat.getTimeInstance().format(date)

法国地区:16:04:58


DateFormat.getTimeInstance(DateFormat.SHORT).format(date)

法国地区:16:04


DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)

法国地区:16:04:58


DateFormat.getTimeInstance(DateFormat.LONG).format(date)

FR语言环境:16:04:58 GMT + 01:00


DateFormat.getTimeInstance(DateFormat.FULL).format(date)

FR区域设置:16:04:58欧洲中央大学



4
感谢您将所有这些案例放在一个地方。如果您还可以只添加时间案例,这将是一个完整的参考。
zeeshan

41

日期到语言环境日期字符串:

Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);

选项:

   DateFormat.getDateInstance() 

-> 1969年12月31日

   DateFormat.getDateTimeInstance() 

-> 1969年12月31日下午4:00:00

   DateFormat.getTimeInstance() 

->下午4:00:00


3
如何从DateFormat.getDateInstance()中删除year?
Hardik Joshi

21

这样可以做到:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

当用户在android设备中更改语言时,会本地化吗?
Kannan_SJD '16

14

使用SimpleDateFormat

像这样:

event.putExtra("starttime", "12/18/2012");

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));

5
是的,使用默认语言环境来避免性能问题:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg

14

请遵循以下步骤:http : //developer.android.com/reference/android/text/format/Time.html

最好使用Android本机Time类:

Time now = new Time();
now.setToNow();

然后格式化:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));

1
@FireZenk:根据您提供的[link](developer.android.com/reference/android/text/format/Time.html):此类存在许多问题,建议改为使用GregorianCalendar
ccpizza 2015年

哦...这个问题信息比我的评论要新,所以这是一个已弃用的答案
FireZenk 2015年

10

使用以下两个作为类变量:

 public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 private Calendar mDate = null;

并像这样使用它:

 mDate = Calendar.getInstance();
 mDate.set(year,months,day);                   
 dateFormat.format(mDate.getTime());

9

这是我的方法,可以定义和输入输出格式。

public static String formattedDateFromString(String inputFormat, String outputFormat, String inputDate){
    if(inputFormat.equals("")){ // if inputFormat = "", set a default input format.
        inputFormat = "yyyy-MM-dd hh:mm:ss";
    }
    if(outputFormat.equals("")){
        outputFormat = "EEEE d 'de' MMMM 'del' yyyy"; // if inputFormat = "", set a default output format.
    }
    Date parsed = null;
    String outputDate = "";

    SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
    SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());

    // You can set a different Locale, This example set a locale of Country Mexico.
    //SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, new Locale("es", "MX"));
    //SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, new Locale("es", "MX"));

    try {
        parsed = df_input.parse(inputDate);
        outputDate = df_output.format(parsed);
    } catch (Exception e) { 
        Log.e("formattedDateFromString", "Exception in formateDateFromstring(): " + e.getMessage());
    }
    return outputDate;

}

8

SimpleDateFormat

我使用不带自定义模式的 SimpleDateFormat ,以设备的预选格式从系统获取实际日期和时间:

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

返回

  • 15.01.15 11:45
  • 15-1-13上午10:45
  • ...


5

其他答案通常是正确的。我想贡献现代的答案。这些类DateDateFormat以及SimpleDateFormat大多数其他答案中使用的类,已经过时了,多年来已经给许多程序员带来麻烦。今天,我们在java.timeAKA JSR-310(现代Java日期和时间API)方面有了很多改进。您可以在Android上使用它吗?最肯定的!在ThreeTenABP项目中,现代类已被移植到Android。看到以下问题:如何在Android Project中使用ThreeTenABP了解所有详细信息。

该代码段将帮助您入门:

    int year = 2017, month = 9, day = 28, hour = 22, minute = 45;
    LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute);
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(dateTime.format(formatter));

当我将计算机的首选语言设置为美国英语或英国英语时,将输出:

Sep 28, 2017 10:45:00 PM

相反,当我将其设置为丹麦语时,我得到:

28-09-2017 22:45:00

因此,它确实遵循配置。不过,我不确定它会详细说明您设备的日期和时间设置的具体细节,并且具体情况因手机而异。



5

日期格式类与作弊代码一起使用来生成日期。喜欢

  1. M-> 7,MM-> 07,MMM-> Jul,MMMM-> July
  2. EEE->星期二,EEEE->星期二
  3. z-> EST,zzz-> EST,zzzz->东部标准时间

您可以在此处查看更多秘籍。


4

此代码将返回当前日期和时间:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}

1
不建议使用toLocaleString()
nspo

4

语言环境

为了从毫秒获取区域设置格式的日期或时间,我使用了以下方法:

日期和时间

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

日期

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);

时间

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

您可以使用其他日期样式和时间样式。有关样式的更多信息,请参见此处




2

我这样使用它:

public class DateUtils {
    static DateUtils instance;
    private final DateFormat dateFormat;
    private final DateFormat timeFormat;

    private DateUtils() {
        dateFormat = android.text.format.DateFormat.getDateFormat(MainApplication.context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(MainApplication.context);
    }

    public static DateUtils getInstance() {
        if (instance == null) {
            instance = new DateUtils();
        }
        return instance;
    }

    public synchronized static String formatDateTime(long timestamp) {
        long milliseconds = timestamp * 1000;
        Date dateTime = new Date(milliseconds);
        String date = getInstance().dateFormat.format(dateTime);
        String time = getInstance().timeFormat.format(dateTime);
        return date + " " + time;
    }
}

1

避免juDate

众所周知,Java(和Android)中的Java.util.Date和.Calendar和SimpleDateFormat十分麻烦。避免他们。它们是如此糟糕,以至于Sun / Oracle放弃了它们,以Java 8中新的java.time软件包取代了它们(2014年时还没有安装Android)。新产品的java.time灵感来自Joda-Time库。

乔达时代

Joda-Time确实可以在Android中使用。

在StackOverflow中搜索“ Joda”可找到许多示例和大量讨论。

使用Joda-Time 2.4的源代码的花絮。

标准格式。

String output = DateTime.now().toString(); 
// Current date-time in user's default time zone with a String representation formatted to the ISO 8601 standard.

本地化格式。

String output = DateTimeFormat.forStyle( "FF" ).print( DateTime.now() ); 
// Full (long) format localized for this user's language and culture.

1

回到2016年,当我想自定义格式时(不根据设备配置,您问...),我通常使用字符串资源文件:

在strings.xml中:

<string name="myDateFormat"><xliff:g id="myDateFormat">%1$td/%1$tm/%1$tY</xliff:g></string>

活动中:

Log.d(TAG, "my custom date format: "+getString(R.string.myDateFormat, new Date()));

这对于发布新的日期绑定库也很有用。

所以我可以在布局文件中添加以下内容:

<TextView
    android:id="@+id/text_release_date"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{@string/myDateFormat(vm.releaseDate)}"
    tools:text="0000"
    />

并在java类中:

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());

0

android时间类提供了3种格式化方法http://developer.android.com/reference/android/text/format/Time.html

这是我的方法:

/**
* This method will format the data from the android Time class (eg. myTime.setToNow())   into the format
* Date: dd.mm.yy Time: hh.mm.ss
*/
private String formatTime(String time)
{
    String fullTime= "";
    String[] sa = new String[2];

    if(time.length()>1)
    {
        Time t = new Time(Time.getCurrentTimezone());
        t.parse(time);
        // or t.setToNow();
        String formattedTime = t.format("%d.%m.%Y %H.%M.%S");
        int x = 0;

        for(String s : formattedTime.split("\\s",2))
        {   
            System.out.println("Value = " + s);
            sa[x] = s;
            x++;
        }
        fullTime = "Date: " + sa[0] + " Time: " + sa[1];
    }
    else{
        fullTime = "No time data";
    }
    return fullTime;
}

希望对您有所帮助:-)


0

为时已晚,但可能对某人有所帮助

DateFormat.format(format, timeInMillis);

format是您需要的格式

例如:“ HH:mm”返回15:30

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.