【问题标题】:Get day & date string using DateFormat class - Android使用 DateFormat 类获取日期和日期字符串 - Android
【发布时间】:2014-01-28 23:01:39
【问题描述】:

我一直在阅读所有关于如何在我的项目中应用获取日期和日期的帖子,但一直无法弄清楚(对 Java 来说非常新)。

我有一个带有时间戳的按钮,但我必须将此时间戳转换为一周中的某一天,并带有日期。例如:2014 年 1 月 4 日,星期二。

日期应该是用户单击按钮时的当前日期。 建议我们使用 DateFormat 类(目前还没有在我的片段文件中使用它),所以在回答中考虑一下。

不过,我的大部分代码已经写好了,所以它必须能很好地适应一切,所以我不能过多地解构。对这个挑战有什么想法吗?我已经将 Crime.java 文件方法更改为 DateFormat(之前它只是使用 Date 类),但其他主要片段文件将需要使用该信息,只是不知道该怎么做。

这是我正在构建时间码的主要片段文件(其中的时间部分):

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {

mDateButton = (Button)v.findViewById(R.id.crime_date);
        mDateButton.setText(mCrime.getDate().toString());
        mDateButton.setEnabled(false);

}

在代码的中间行需要改变一些东西。目前它带来了一个时间戳,但我不知道为什么(它必须是在 Date 类上调用的 getDate() 的默认值?)

这是我单独的犯罪类文件,以及我的所有实例(整个文件):

 public class Crime {

        private UUID mId;
        private String mTitle;
        private DateFormat mDate;
        private boolean mSolved;

        public Crime() {
            //Generate unique identifier
            mId = UUID.randomUUID();
            mDate = new DateFormat();
        }

        public String getTitle() {
            return mTitle;
        }

        public void setTitle(String title) {
            mTitle = title;
        }

        public UUID getId() {
            return mId;
        }

        public DateFormat getDate() {
            return mDate;
        }

        public void setDate(DateFormat date) {
            mDate = date;
        }

        public boolean isSolved() {
            return mSolved;
        }

        public void setSolved(boolean solved) {
            mSolved = solved;
        }


    }

【问题讨论】:

  • 在Crime.java 中你看到import 声明DateFormat - 类似于 - import java.text.DateFormat; 吗?
  • 是的,导入没问题:import android.text.format.DateFormat;

标签: java android date android-fragments date-format


【解决方案1】:

我认为您对日期格式感到困惑,

来自 Java 文档

DateFormat 是日期/时间格式子类的抽象类 它以独立于语言的方式格式化和解析日期或时间 方式。日期/时间格式化子类,例如 SimpleDateFormat, 允许格式化(即日期 -> 文本),解析(文本 -> 日期), 和规范化。日期表示为 Date 对象或 自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。

您需要定义DateFormat 模式,例如在我的情况下是dd-MMM-yyyy HH:mm:ss,例如:

private static ThreadLocal<SimpleDateFormat> simpleDateFormatPool = new ThreadLocal<SimpleDateFormat>(){
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("EEEE dd-MMM-yyyy HH:mm:ss");
        };
    };

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SimpleDateFormat dateFormat = null;
        if(dateFormat == null){
            dateFormat = simpleDateFormatPool.get();
        }
        System.out.println(dateFormat.format(new Date(System.currentTimeMillis())));
    }

输出

Friday 10-Jan-2014 10:41:19

【讨论】:

  • 感谢 Prateek,虽然这段代码使用了我一无所知的类,而且我对事物有很多疑问,但我认为我理解它的程度不足以使用它。另外,在我们的书中,建议使用 DateFormat,所以我必须找到一种方法来做到这一点。不幸的是,此时 DateFormat 的定义对我来说听起来像是一门外语。我有点理解我确实需要以某种方式定义日期格式,例如您的“EEEE dd-MMM-yyyy”示例以获得我想要的结果,但不确定如何简单有效地做到这一点所有这些其他类。
  • @NoniA。无需混淆,DateFormat 只是用来获取我们想要的格式的日期。
  • 感谢 Prateek :) 现在只要我能在我的代码中使用这些知识!我必须找到一种方法来改变很少并使用我所拥有的,但会继续尝试。
【解决方案2】:

你可以试试:

String formattedDate = null;

long timeInMillis = System.currentTimeMillis();
Calendar cal1 = Calendar.getInstance();
cal1.setTimeInMillis(timeInMillis);
SimpleDateFormat dateFormat = new SimpleDateFormat(
                                        "EEEE, MMM, dd, yyyy");
formattedDate = dateFormat.format(cal1.getTime());

这会给你输出:Friday, Jan, 10, 2014

希望这能提供一些想法。

【讨论】:

  • 嗨 Mystic,谢谢.. 我尝试将代码放入我的 onCreateView() 方法中,并将变量放在顶部,我没有收到任何错误,但后来我运行了它我的按钮现在是空白的,上面什么都没有。 :(知道为什么吗?
  • 感谢 Mystic,我意识到 DateFormat 类未包含在您的代码中,因此很遗憾我不得不尝试另一种方式来使用该类。有没有什么方法可以在我现有的代码中尽可能多地使用该类,而不会过多地更改代码结构(添加新的类和变量等)?如果你看不到路也没关系。还是一样的感谢。
【解决方案3】:

你可以试试这个

Date d1 =new Date();
SimpleDateFormat date = new SimpleDateFormat("EEEE, MMM'.', dd'th', yyyy");
System.out.println(date.format(d1));

OUTPUT:   
 Tuesday, Jan. 4th, 2014.

【讨论】:

  • 感谢 Kaustubh,它看起来既好又简单,但我找不到将其融入现有代码的方法。我的 Crime.java 文件中已经有一个日期变量,如果我更改它,我不知道它会产生什么后果。我必须找到一种方法将代码放入这一行:mDateButton.setText(mCrime.getDate().toString());,因为那是当前时间戳所在的位置。 mDateButton 是新日期所在的位置,因此我必须以某种方式保留该行的功能。我也不能使用System.out.printlin();,因为代码必须在那个按钮上。
  • 好的,我有一个解决方案。替换以下行它不会影响您的代码。 mDate = new SimpleDateFormat("EEEE, MMM'.', dd'th', yyyy"); // SimpleDateFormat 是 DateFormat 的子类 mDateButton.setText(mCrime.getDate().formate(new Date()));
  • @NoniA。您可以使用mCrime.getDate() 而不是d1 或创建新变量。我就是这么做的。
【解决方案4】:

由于您被 DateFormat 困住,它似乎不像 SimpleDateFormat 选项那样灵活。不过,您可以使用它来满足您的需求,如下所示:

假设: 你正在使用

import java.text.DateFormat;

您修改后的代码:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
     mDateButton = (Button)v.findViewById(R.id.crime_date);
     mCrime.setDate(DateFormat.getDateInstance(DateFormat.FULL));
     mDateButton.setText(mCrime.getDate().format(new Date()));
     mDateButton.setEnabled(false);
...

编辑: 因为,您的 DataFormat 属于 android.text.format.DateFormat 类型,请将您的代码更改为以下内容:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
     mDateButton = (Button)v.findViewById(R.id.crime_date);
     mDateButton.setText(android.text.format.DateFormat.format("EEEE, MMM dd yyyy", new java.util.Date()));
     mDateButton.setEnabled(false);
...

【讨论】:

  • 感谢 Popo,这似乎更接近我的原始代码!我试图把它放进去,但有 2 个错误。 1 用“FULL”表示它不能被解析为一个字段,一个用“format”表示:“DateFormat 类型中的方法格式(CharSequence,long)不适用于参数(Date)”我导入 DateFormat 就好了并且还将我的 Crime.java 中的所有 Date 类更改为 DateFormat 好(没有错误)。不确定这是否与我的版本构建有关,但我使用的是 API 8。
  • 啊,是的,我改了它,它摆脱了格式错误!但我仍然有 .FULL 错误。
  • Popo,为什么那个导入会产生影响,为什么它没有自动导入自己?
  • 成功!!!感谢一百万波波。不过,我可以问一个问题,用所有这些点命名的系列是什么,android.text.format.DateFormat.format(),为什么要创建一个new java.util.Date()?我是个初学者,这些对我来说很陌生。
  • @NoniA。耶!!当然,正如您在此处的所有答案中看到的那样,有很多 DateFormatter 可用;由于您使用的是特定的 android 版本,为了避免与其他人发生冲突,我们使用完全限定名称(所有这些点)。 Date 类是 Java 原生的,新实例 (new Date()) 将始终定义当前时间。更多细节在这里 - docs.oracle.com/javase/7/docs/api/java/util/Date.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多