android - reconoce - reparar tarjeta sd dañada desde el movil
La mejor forma de formatear una fecha relativa a ahora en Android (9)
Estoy creando una función en una aplicación de Android para obtener una fecha arbitraria (pasada, presente o futura) y encuentro la diferencia relativa a ahora.
Tanto mi now
como las variables due
son longs
, y este es mi código:
long now = System.currentTimeMillis();
long due = now + 864000;
Log.d("Time in 1 day", DateUtils.getRelativeTimeSpanString(due,now, DateUtils.DAY_IN_MILLIS));
Quiero que la salida sea algo así como yesterday
, today
, in 4 days
o 19/12/2012
. Sin embargo, el resultado actual vuelve in 0 days
...
No quiero que el tiempo aparezca en estas cadenas de fechas.
¿Qué estoy haciendo mal y es el mejor método para formatear fechas en Android?
¡Finalmente he implementado lo que querías ...!
Primero necesitas descargar Joda Time desde aquí
Extraelo en cualquier carpeta y coloca joda-time-2.2.jar en la carpeta androidProject / libs.
Actividad principal
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Months;
import org.joda.time.MutableDateTime;
import org.joda.time.Weeks;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
public class MainActivity extends Activity
{
private int day ;
private int month ;
private int year ;
private int hour ;
private int minute ;
private long selectedTimeInMillis;
private long currentTimeInMillis;
private String strDay ="";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
year = 2013;
month = 8;
day = 10;
hour = 15;
minute = 28;
DateTime selectedTime = new DateTime(year,month,day,hour,minute);
selectedTimeInMillis = selectedTime.getMillis();
MutableDateTime epoch = new MutableDateTime();
epoch.setDate(selectedTimeInMillis); //Set to Epoch time
DateTime now = new DateTime();
currentTimeInMillis = now.getMillis();
int days = Days.daysBetween(epoch, now).getDays();
int weeks = Weeks.weeksBetween(epoch, now).getWeeks();
int months = Months.monthsBetween(epoch, now).getMonths();
Log.v("days since epoch: ",""+days);
Log.v("weeks since epoch: ",""+weeks);
Log.v("months since epoch: ",""+months);
if(selectedTimeInMillis < currentTimeInMillis) //Past
{
long yesterdayTimeInMillis = currentTimeInMillis - 86400000;
DateTime today = new DateTime(currentTimeInMillis);
int year = today.getDayOfYear();
int intToday = today.getDayOfMonth();
DateTime yesterday = new DateTime(yesterdayTimeInMillis);
int intYesterday = yesterday.getDayOfMonth();
DateTime selectedDay = new DateTime(selectedTimeInMillis);
int intselectedDay = selectedDay.getDayOfMonth();
int intselectedYear = selectedDay.getDayOfYear();
if(intToday == intselectedDay & year == intselectedYear)
{
strDay = "today";
}
else if(intYesterday == intselectedDay)
{
strDay = "yesterday";
}
else
{
strDay = "before "+ days +" days from today";
}
}
else if(selectedTimeInMillis > currentTimeInMillis) //Future
{
long tomorrowTimeInMillis = currentTimeInMillis + 86400000;
DateTime tomorrow = new DateTime(tomorrowTimeInMillis);
int intTomorrow = tomorrow.getDayOfMonth();
DateTime today = new DateTime(selectedTimeInMillis);
int intToday = today.getDayOfMonth();
if(intToday == intTomorrow)
{
strDay = "tomorrow";
}
else
{
days = -days;
strDay = "after "+ days +" days from today";
}
}
Log.v("strDay: ",""+strDay);
}
}
Solo necesita cambiar el valor del día y obtendrá el resultado deseado. Actualmente he dado la fecha 10 como entrada, así que la salida será hoy.
He establecido la fecha / día = 10 , mes = 8 , año = 2013 , hora = 15 , min = 28
Para fechas pasadas:
input day 9 output yesterday
input day 3 output before 7 days from today
input year 2012 and day 10 output before 365 days from today
Para fechas futuras:
input day 11 output tomorrow
input day 27 output after 17 days from today
input day 23 and year 2016 output after 1109 days from today
¿Por qué no simplemente verificar el yesterday
y el tomorrow
para evitar la DateUtils.getRelativeTimeSpanString
0 days ago
in 0 days
/ 0 days ago
y dejar que DateUtils.getRelativeTimeSpanString
maneje los casos restantes?
String relative = null;
if(now < due && (due-now)<864000){
relative = "tomorrow";
}else if(now > due && (now-due)<864000){
relative = "yesterday";
}else{
relative = DateUtils.getRelativeTimeSpanString(due, now, DateUtils.DAY_IN_MILLIS); // e.g. "in 4 days"
}
Log.d("result", relative);
Editar: También puede agregar today
con una simple verificación también.
Entonces su cálculo se basa en unidades de milisegundos, luego formatee el resultado con SimpleDateFormat.
Para esto, puede usar fácilmente el formateador SimpleDateFormat así:
Date date = new Date(milliseconds);
SimpleDateFormat formatter = new SimpleDateFormat("EEEE dd MMMM yyyy");
String strDate = formatter.format(date);
Entonces su computación debe basarse en unidades de milisegundos, luego formatee el resultado con SimpleDateFormat.
El patrón ("EEEE dd MMMM yyyy") le permite obtener un formato de fecha como el lunes, 4 de febrero de 2013.
Puede cambiar el patrón como desee: "EEEE dd / MM / aa", ...
La razón real es que el número 864000 está en milisegundos, lo que corresponde a 14 minutos. 14 minutos es tan pequeño en comparación con DAY_IN_MILLIS (un día). Allí para obtener "en 0 días". Si desea que se produzca "en 14 minutos", simplemente cambie DAY_IN_MILLIS a MIN_IN_MILLIS.
Lo que tengo en mente es cambiar:
DateUtils.getRelativeTimeSpanString(due, now, 0L, DateUtils.FORMAT_ABBREV_ALL);
Dado que la documentación dice que devuelve el tiempo relativo a ahora.
Si eso falla, use algunas de las geniales bibliotecas:
long now = System.currentTimeMillis ();
DateUtils.getRelativeDateTimeString (mContext, ahora), DateUtils.SECOND_IN_MILLIS, DateUtils.DAY_IN_MILLIS, 0)
para Android puedes usar la forma más simple con la biblioteca Joda-Time-Android :
Date yourTime = new Date();
DateTime dateTime = new DateTime(yourTime); //or simple DateTime.now()
final String result = DateUtils.getRelativeTimeSpanString(getContext(), dateTime);
build.gradle
compile ''joda-time:joda-time:2.9.9''
Utils.java
private static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MMM dd, yyyy");
private static SimpleDateFormat TIME_FORMAT = new SimpleDateFormat(" ''at'' h:mm aa");
public static String getRelativeDateTimeString(Calendar startDateCalendar) {
if (startDateCalendar == null) return null;
DateTime startDate = new DateTime(startDateCalendar.getTimeInMillis());
DateTime today = new DateTime();
int days = Days.daysBetween(today.withTimeAtStartOfDay(), startDate.withTimeAtStartOfDay()).getDays();
String date;
switch (days) {
case -1: date = "Yesterday"; break;
case 0: date = "Today"; break;
case 1: date = "Tomorrow"; break;
default: date = DATE_FORMAT.format(startDateCalendar.getTime()); break;
}
String time = TIME_FORMAT.format(startDateCalendar.getTime());
return date + time;
}
Salida
Yesterday at 9:52 AM
Today at 9:52 AM
Tomorrow at 9:52 AM
Sep 05, 2017 at 9:52 AM