Android: Compare time in this format `yyyy-mm-dd hh:mm:ss` to the current moment

风格不统一 提交于 2020-07-02 18:12:12

问题


I want to get the current time on the device in the format: 2013-10-17 15:45:01 ?

The server sends me the date of an object in the format above as a string. Now i want to get the phones current time and then check if there is a difference of say more than 5 minutes?

So A: How can i get the devices current time in this fomat: 2013-10-17 15:45:01

B how can I work out the difference between the two.


回答1:


You can use SimpleDateFormat to specify the pattern you want:

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date())

However, if you just want to know whether the time difference is within a certain threshold, you should probably just compare long values. If your threshold is 5 minutes, then this is 5 * 60 * 1000 milliseconds so you can use the same SimpleDateFormat by calling it's parse method and check the long values.

Example:

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2013-10-13 14:54:03").getTime()



回答2:


Date currentDate = new Date(); will initialize a new date with the current time. In addition, convert the server provided time and take the difference.

String objectCreatedDateString = "2013-10-17 15:45:01";  
SimpleDateFormat  format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date objectCreatedDate = null;
Date currentDate = new Date();
try 
{objectCreatedDate = format.parse(objectCreatedDateString);} 
catch (ParseException e) 
{Log.e(TAG, e.getMessage());}
int timeDifferential;
if (objectCreatedDate != null)
    timeDifferential = objectCreatedDate.getMinutes() - currentDate.getMinutes();



回答3:


Use SimpleDateFromat Class

DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
dateFormatter.format(date);

Also check this documentation




回答4:


If you can ask the server to send you an RFC3339 compliant date/time string, then Here is a simple answer to both of your questions:

public String getClientTime() {
    Time clientTime = new  Time().setToNow();
    return clientTime.format("%Y-%m-%d %H:%M:%S");
}

public int diffClientAndServerTime(String svrTimeStr) {
    Time svrTime = new Time();
    svrTime.parse3339(svrTimeStr);

    Time clientTime = new  Time();
    clientTime.setToNow();
    return svrTime.compare( svrTime, clientTime);
}



回答5:


tl;dr

Duration.between(  // Calculate time elapsed between two moments.
    LocalDateTime  // Represent a date with time-of-day but lacking the context of a time zone or offset-from-UTC.
        .parse( "2013-10-17 15:45:01".replace( " " , "T" ) )
        .atOffset( ZoneOffset.UTC )  // Returns an `OffsetDateTime` object.
        .toInstant() ,  // Returns an `Instant` object.
    Instant.now() // Capture the current moment as seen in UTC.
)
.toMinutes()
> 5

java.time

The other Answers are outdated, using terrible classes that were years ago supplanted by the modern java.time classes defined in JSR 310.

Parse your incoming string.

String input = "2013-10-17 15:45:01" ;

Modify the input to comply with ISO 8601. I suggest you educate the publisher of your data about the ISO 8601 standard.

String inoutModified = input.replace( " " , "T" ) ;

Parse as a LocalDateTime because this input lacks an indicator of the intended offset or time zone.

LocalDateTime ldt = LocalDateTime.parse( input ) ;

I assume that input was intended to represent a moment as seen in UTC, with an offset of zero hours minutes seconds. If so, educate the publisher of your data about appending a Z on the end to so indicate, per ISO 8601.

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

Extract an object of the simpler class, Instant. This class is always in UTC.

Instant then = odt.toInstant() ;

Get current moment as seen in UTC.

Instant now = Instant.now() ; 

Calculate the difference.

Duration d = Duration.between( then , now ) ; 

Get duration as total whole minutes.

long minutes = d.toMinutes() ;

Test.

if ( minutes > 5 ) { … }

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes. Hibernate 5 & JPA 2.2 support java.time.

Where to obtain the java.time classes?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation.
    • Java 9 brought some minor features and fixes.
  • Java SE 6 and Java SE 7
    • Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
    • Later versions of Android (26+) bundle implementations of the java.time classes.
    • For earlier Android (<26), a process known as API desugaring brings a subset of the java.time functionality not originally built into Android.
      • If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….



来源:https://stackoverflow.com/questions/19437791/android-compare-time-in-this-format-yyyy-mm-dd-hhmmss-to-the-current-moment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!