我最近开始使用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()方法吗?
编辑
我将对象的属性更改为字符串类型,尽管呈现起来更容易。将它们转换为日期的原因是,我需要计算两个家伙之间的持续时间,但这不是我无法解决的问题。感谢社区。 p>
答案 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>
查看输出:
请参见输出的屏幕截图,例如您的要求获取当前日期:
请参阅此Tutorial
希望这可能对您有帮助
答案 2 :(得分:1)
使用现代的 java.time 类,而不要使用可怕的旧Date
和SimpleDateFormat
类。
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.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格式生成文本的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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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()));
我希望有帮助。