toString()返回Date对象上的意外内容

时间:2018-08-16 10:20:29

标签: android date tostring

我最近开始使用Android Studio 3.1.2和SDK 19编码我的第一个Android项目。

我的一个对象具有Date属性。在某些时候,我想在TextView中显示整个日期时间或其中的一部分。所以我以菜鸟的方式尝试了一下,并在Date上调用了toString()。 但是,显示的文本包含我在用于创建日期对象的SingleDateFormat模式中未定义的元素。

这是我在myObject上创建日期的方法:

Date date1;
Date date2;

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
    date1 = format.parse(json.getString("date_1"));
    dtae2 = format.parse(json.getString("date_2"));
} catch(ParseException e) {
    //error handling stuff
    e.printStackTrace();
}

这是我要在视图上显示日期的地方:

myTextView.setText("First appearance logged at " + myObject.getDate1().toString());

我希望显示类似2018-08-16 12:14:42的字符串。相反,我得到的是Thu Aug 12:14:42 GMT +02:00 2018。这似乎是另一个DateFormat,并且忽略了我的自定义模式。

所以我的问题是,是否有一种方法可以操纵toString()的输出,所以Date以我在模式中定义的方式显示。我可以通过某种方式将模式传递给toString()方法吗?

编辑

我将对象的属性更改为字符串类型,尽管呈现起来更容易。将它们转换为日期的原因是,我需要计算两个家伙之间的持续时间,但这不是我无法解决的问题。感谢社区。

5 个答案:

答案 0 :(得分:1)

根据您的需要,您可以只使用json.getString("date_1")

您不需要设置额外的逻辑。当您要将String日期转换为Date对象以进行某些计算时,需要进行解析。

如果要更改接收日期的格式,请使用此方法。

changeStringDateFormat(json.getString("date_1"), "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd");

只需将此方法放入您的实用程序中即可。

public String changeStringDateFormat(String date, String inputDateFormat, String outPutDateFormat) {
    Date initDate = null;
    try {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(inputDateFormat);
        initDate = simpleDateFormat.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    SimpleDateFormat outputFormatter = new SimpleDateFormat(outPutDateFormat);
    String parsedDate = outputFormatter.format(initDate);
    return parsedDate;
}

请参见 Java Date Doc ,它以默认格式返回字符串。

  

公共字符串toString()

     

将此Date对象转换为以下形式的字符串:

     

dow mon dd hh:mm:ss zzz yyyy

答案 1 :(得分:1)

只需编写此代码段

JAVA文件

 public class MainActivity extends AppCompatActivity {
    TextView my_text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        my_text = findViewById(R.id.my_text);

        String pattern = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        String date = simpleDateFormat.format(new Date());
        Toast.makeText(getApplicationContext(), "" + date, Toast.LENGTH_SHORT).show();
        my_text.setText("Your Date is :  " + date);
    }
}

XML文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="mydemo.com.anew.MainActivity">

    <TextView
        android:id="@+id/my_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

查看输出:

enter image description here

请参见输出的屏幕截图,例如您的要求获取当前日期:

enter image description here

请参阅此Tutorial

希望这可能对您有帮助

答案 2 :(得分:1)

tl; dr

使用现代的 java.time 类,而不要使用可怕的旧DateSimpleDateFormat类。

myJavaUtilDate          // Never use `java.util.Date`.
.toInstant()            // Convert from legacy class to modern replacement. Returns a `Instant` object, a moment in UTC.
.atOffset(              // Convert from the basic `Instant` class to the more flexible `OffsetDateTime` class.
    ZoneOffset.UTC      // Constant defining an offset-from-UTC of zero, UTC itself.
)                       // Returns a `OffsetDateTime` object.
.format(                // Generate a `String` with text representing the value of this `OffsetDateTime` object.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME  // Pre-defined formatter stored in this constant. 
)                       // Returns a `String` object.
.replace( "T" , " " )   // Replace the standard `T` in the middle with your desired SPACE character.
  

2018-08-16 10:14:42

java.time

您使用的是可怕的旧类,而这些旧类早在几年前就被 java.time 类所取代。

如果递给java.util.Date对象,请立即转换为java.time.Instant。两者都代表UTC的时刻。 Instant的分辨率比毫秒更好,而不是毫秒。

要在旧类和现代类之间进行转换,请查看添加到旧类中的新转换方法。

Instant

Instant instant = myJavaUtilDate.toInstant() ;  // New method on old class for converting to/from java.time classes.

ISO 8601

要使用与所需格式相似的标准ISO 8601格式生成文本的String,请致电toString

String output = instant.toString() ;  // Generate text in standard ISO 8601 format.

经过的时间= Duration

顺便说一句,要计算经过的时间,请使用Duration类。传递一对Instant对象以计算24小时的“天”数,小时,分钟和秒数。

Duration d = Duration.between( start , stop ) ;  // Calc elapsed time.
  

2018-08-16T10:14:42Z

OffsetDateTime

对于其他格式,请从基本的Instant类转换为更灵活的OffsetDateTime类。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
  

odt.toString():2018-08-16T10:14:42Z

DateTimeFormatter

您想要的格式接近于预定义的格式设置器DateTimeFormatter.ISO_LOCAL_DATE_TIME。只需用空格替换中间的T

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " ) ;
  

2018-08-16 10:14:42

ZonedDateTime

请记住,到目前为止,我们仅关注UTC。在任何给定的时刻,日期和时间在全球范围内都会有所不同。

如果您想通过某个地区(某个时区)的人们使用的挂钟时间的镜头看到同一时刻,请应用ZoneId以获得ZonedDateTime对象。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
  

zdt.toString():2018-08-16T11:14:42 + 01:00 [非洲/突尼斯]

您可以使用与上述相同的格式化程序来生成所需格式的字符串。

String output = zdt.format( f ) ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:0)

您需要使用 SimpleDateFormat ,如下所示:

String myFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
myTextView.setText("First appearance logged at " + sdf.format(date1));

答案 4 :(得分:0)

在我的项目中,我一直在使用format()函数进行格式化,例如:

myTextView.setText("First appearance logged at " + format.format(myObject.getData1()));

我希望有帮助。