Android, jak mogę przekonwertować ciąg na datę?

142

Zapisuję aktualny czas w bazie danych za każdym razem, gdy aplikacja jest uruchamiana przez użytkownika.

Calendar c = Calendar.getInstance();
    String str = c.getTime().toString();
    Log.i("Current time", str);

Po stronie bazy danych przechowuję aktualny czas jako string (jak widać w powyższym kodzie). Dlatego kiedy ładuję go z bazy danych, muszę rzucić go na obiekt Date. Widziałem kilka próbek, w których wszystkie używały „DateFormat”. Ale mój format jest dokładnie taki sam jak format daty. Więc myślę, że nie ma potrzeby używania „DateFormat”. Czy mam rację?

Czy istnieje możliwość bezpośredniego rzutowania tego ciągu na obiekt Date? Chcę porównać ten zapisany czas z aktualnym czasem.

Dzięki

======> aktualizacja

Dzięki, drodzy. Użyłem następującego kodu:

private boolean isPackageExpired(String date){
        boolean isExpired=false;
        Date expiredDate = stringToDate(date, "EEE MMM d HH:mm:ss zz yyyy");        
        if (new Date().after(expiredDate)) isExpired=true;

        return isExpired;
    }

    private Date stringToDate(String aDate,String aFormat) {

      if(aDate==null) return null;
      ParsePosition pos = new ParsePosition(0);
      SimpleDateFormat simpledateformat = new SimpleDateFormat(aFormat);
      Date stringDate = simpledateformat.parse(aDate, pos);
      return stringDate;            

   }
Hesam
źródło

Odpowiedzi:

419

Od ciągu do daty

String dtStart = "2010-10-15T09:27:37Z";  
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");  
try {  
    Date date = format.parse(dtStart);  
    System.out.println(date);  
} catch (ParseException e) {
    e.printStackTrace();  
}

Od daty do ciągu

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");  
try {  
    Date date = new Date();  
    String dateTime = dateFormat.format(date);
    System.out.println("Current Date Time : " + dateTime); 
} catch (ParseException e) {
    e.printStackTrace();  
}
user370305
źródło
Dokładnie - lepiej jest zastosować jakiś standardowy formularz do ciągu daty przed zapisaniem go w bazie danych. W tym przypadku en.wikipedia.org/wiki/ISO_8601
denis.solonenko
Aby uzyskać bardziej precyzyjne rozwiązanie dotyczące „aktualnego ciągu znaków”, wygodnie jest dodać „format.setLenient (false);” przed blokiem try ... catch. W ten sposób sprawdzanie poprzednio poprawnej daty ciągu będzie lepsze.
Alecs
Nie wierzę, że SimpleDateFormat.format()rzuca wyjątek
Ktoś gdzieś
2
jeśli masz wersję SDK wyższą lub równą Marshmallow, użyj w ten sposób SimpleDateFormat dateFormat =new SimpleDateFormat(""yyyy-MM-dd'T'HH:mm:ss'Z'"", Locale.getDefault());
Dheeraj Jaiswal,
8
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date d = dateFormat.parse(datestring)
Hiren Dabhi
źródło
2
nie należy analizować String jako zmiennej? Ponieważ w ten sposób próbuje przeanalizować słowo „ciąg”.
Marco
6

przy użyciu klasy SimpleDateFormat lub DateFormat do

np

try{
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); // here set the pattern as you date in string was containing like date/month/year
Date d = sdf.parse("20/12/2011");
}catch(ParseException ex){
    // handle parsing exception if date string was different from the pattern applying into the SimpleDateFormat contructor
}
Pratik
źródło
4
     import java.text.ParseException;
     import java.text.SimpleDateFormat;
     import java.util.Date;
     public class MyClass 
     {
     public static void main(String args[]) 
     {
     SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");

     String dateInString = "Wed Mar 14 15:30:00 EET 2018";

     SimpleDateFormat formatterOut = new SimpleDateFormat("dd MMM yyyy");


     try {

        Date date = formatter.parse(dateInString);
        System.out.println(date);
        System.out.println(formatterOut.format(date));

         } catch (ParseException e) {
        e.printStackTrace();
         }
    }
    }

tutaj jest obiekt data data i wyjście jest:

Środa, 14 marca, 13:30:00 UTC 2018

14 marca 2018 roku

Janku
źródło
Dziękuję bardzo!
Maryoomi 1
1

Dobrym pomysłem może być ostrożność z lokalizacją, od której c.getTime().toString();zależy.

Jednym z pomysłów jest przechowywanie czasu w sekundach (np. Czas UNIX ). Jako że intmożesz go łatwo porównać, a następnie po prostu przekonwertować go na łańcuch podczas wyświetlania go użytkownikowi.

BIEC TRUCHTEM
źródło
1
String source = "24/10/17";

String[] sourceSplit= source.split("/");

int anno= Integer.parseInt(sourceSplit[2]);
int mese= Integer.parseInt(sourceSplit[1]);
int giorno= Integer.parseInt(sourceSplit[0]);

    GregorianCalendar calendar = new GregorianCalendar();
  calendar.set(anno,mese-1,giorno);
  Date   data1= calendar.getTime();
  SimpleDateFormat myFormat = new SimpleDateFormat("20yy-MM-dd");

    String   dayFormatted= myFormat.format(data1);

    System.out.println("data formattata,-->"+dayFormatted);
paolixx
źródło