¿Cómo obtener el primer día de la semana y mes actuales?
Tengo la fecha de varios eventos expresados en milisegundos [1], y quiero saber qué eventos están dentro de la semana actual y el mes actual, pero no puedo averiguar cómo obtener el primer día (día / mes / año) ) De la semana en curso y convertirlo en milisegundos, igual para el primer día del mes.
[1]Since January 1, 1970, 00:00:00 GMT
- Mejor manera de acceder a la base de datos en la aplicación multi-threaded Android?
- Android - Error: Error de ejecución para la tarea ': app: mergeDebugResources'
- Java Android leer el archivo completo rápidamente
- RecyclerViewAdapter.notifyDataSetChanged () en una referencia de objeto nulo
- Eliminación de archivos creados con FileOutputStream
- Creación de LinearLayout en Java - Los elementos no se muestran
- Java / Android cómo iniciar un AsyncTask después de 3 segundos de retraso?
- Cómo extraer formas geométricas simples de contornos en opencv
- Establecer funcionalidad del botón de retroceso del widget de búsqueda
- Reemplazar la primera aparición de caracteres en Android / Java?
- Cómo agregar rectángulos encima del rectángulo existente en el lienzo
- Android Asyntask: Usar referencia débil para el contexto para evitar la rotación del dispositivo de pantalla
- Contexto nulo Puntero
Esta semana en milisegundos:
// get today and clear time of day Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day ! cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); // get start of this week in milliseconds cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); System.out.println("Start of this week: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis()); // start of the next week cal.add(Calendar.WEEK_OF_YEAR, 1); System.out.println("Start of the next week: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis());
Este mes en milisegundos:
// get today and clear time of day Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day ! cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); // get start of the month cal.set(Calendar.DAY_OF_MONTH, 1); System.out.println("Start of the month: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis()); // get start of the next month cal.add(Calendar.MONTH, 1); System.out.println("Start of the next month: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis());
El primer día de la semana se puede determinar con la ayuda de java.util.Calendar
como sigue:
Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTimeInMillis(timestamp); while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) { calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week. } long firstDayOfWeekTimestamp = calendar.getTimeInMillis();
El primer día del mes se puede determinar de la siguiente manera:
Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTimeInMillis(timestamp); while (calendar.get(Calendar.DATE) > 1) { calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of month. } long firstDayOfMonthTimestamp = calendar.getTimeInMillis();
Bastante detallado, sí.
Java 7 vendrá con una API mucho mejorada de fecha y hora ( JSR-310 ). Si no puede cambiar todavía, entonces usted puede usar JodaTime lo que hace que todo sea menos complicado:
DateTime dateTime = new DateTime(timestamp); long firstDayOfWeekTimestamp = dateTime.withDayOfWeek(1).getMillis();
y
DateTime dateTime = new DateTime(timestamp); long firstDayOfMonthTimestamp = dateTime.withDayOfMonth(1).getMillis();
¡Atención!
while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) { calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week. }
Es una buena idea, pero hay algún problema: Por ejemplo, soy de Ucrania y calendar.getFirstDayOfWeek () en mi país es 2 (lunes). Y hoy es 1 (domingo). En este caso no se llama a calendar.add.
Por lo tanto, la forma correcta es el cambio ">" a "! =":
while (calendar.get(Calendar.DAY_OF_WEEK) != calendar.getFirstDayOfWeek()) {...
Java.time
El framework java.time en Java 8 y posteriores suplanta las viejas clases java.util.Date/.Calendar. Las viejas clases han demostrado ser problemáticas, confusas y defectuosas. Evítales.
El framework java.time está inspirado en la altamente exitosa biblioteca Joda-Time , definida por JSR 310 , ampliada por el proyecto ThreeTen-Extra y explicada en el Tutorial .
Instant
La clase Instant
representa un momento en la línea de tiempo en UTC .
El marco java.time tiene una resolución de nanosegundos, o 9 dígitos de un segundo fraccionario. Milliseconds es sólo 3 dígitos de un segundo fraccionario. Debido a que la resolución de milisegundos es común, java.time incluye un práctico método de fábrica.
long millisecondsSinceEpoch = 1446959825213L; Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );
MillisecondsSinceEpoch: 1446959825213 es instantánea: 2015-11-08T05: 17: 05.213Z
ZonedDateTime
Para considerar la semana actual y el mes actual, necesitamos aplicar una zona horaria particular.
ZoneId zoneId = ZoneId.of ( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
En zoneId: America / Montreal que es: 2015-11-08T00: 17: 05.213-05: 00 [America / Montreal]
Medio abierto
En el trabajo de fecha y hora, comúnmente utilizamos el enfoque de medio abrir para definir un lapso de tiempo. El principio es inclusivo mientras que el final es exclusivo . En lugar de tratar de determinar la última fracción de segundo del final de la semana (o mes), obtendremos el primer momento de la siguiente semana (o mes). Así que una semana se ejecuta desde el primer momento del lunes y va hasta, pero sin incluir el primer momento del lunes siguiente .
Vamos al primer día de la semana, y el último. El marco java.time incluye una herramienta para eso, el método with
y el enum ChronoField
.
De forma predeterminada, java.time utiliza el estándar ISO 8601 . Así que el lunes es el primer día de la semana (1) y el domingo es el último (7).
ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week. ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );
Esta semana va desde: 2015-11-02T00: 17: 05.213-05: 00 [América / Montreal] hasta 2015-11-09T00: 17: 05.213-05: 00 [América / Montreal]
¡Vaya! Mire la hora del día sobre esos valores. Queremos el primer momento del día. El primer momento del día no siempre es 00:00:00.000
debido al horario de verano (DST) u otras anomalías. Así que debemos dejar que java.time haga el ajuste en nuestro nombre. Para ello, debemos pasar por la clase LocalDate
.
ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week. firstOfWeek = firstOfWeek.toLocalDate ().atStartOfDay ( zoneId ); ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );
Esta semana va desde: 2015-11-02T00: 00-05: 00 [América / Montreal] hasta 2015-11-09T00: 00-05: 00 [América / Montreal]
Y lo mismo para el mes.
ZonedDateTime firstOfMonth = zdt.with ( ChronoField.DAY_OF_MONTH , 1 ); firstOfMonth = firstOfMonth.toLocalDate ().atStartOfDay ( zoneId ); ZonedDateTime firstOfNextMonth = firstOfMonth.plusMonths ( 1 );
Ese mes va desde: 2015-11-01T00: 00-04: 00 [América / Montreal] hasta 2015-12-01T00: 00-05: 00 [América / Montreal]
YearMonth
Otra forma de ver si un par de momentos están en el mismo mes es comprobar el mismo valor de YearMonth
.
Por ejemplo, suponiendo que este thisZdt
y que thatZdt
son ambos ZonedDateTime
objetos:
boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;
Milisegundos
Recomiendo encarecidamente no hacer su trabajo de fecha y hora en milisegundos a partir de la época. Ésa es de hecho la forma en que las clases de fecha y hora tienden a trabajar internamente, pero tenemos las clases por una razón. Manejar un recuento de la época es torpe ya que los valores no son inteligibles por los seres humanos, por lo que la depuración y el registro son difíciles y propensos a errores. Y, como ya hemos visto, diferentes resoluciones pueden estar en juego; Las antiguas clases de Java y los usos de la biblioteca Joda-Time en milisegundos, mientras que las bases de datos como Postgres utilizan microsegundos y ahora java.time utiliza nanoseconds.
¿Manipularías el texto como bits, o dejarías que clases como String
, StringBuffer
y StringBuilder
manejaran tales detalles?
Pero si insistes, a partir de un ZonedDateTime
obtener un Instant
, y de que obtener un milisegundos de contar desde la época. Pero tenga en cuenta que esta llamada puede significar la pérdida de datos . Cualquier microsegundo o nanosegundo que pueda tener en ZonedDateTime
/ Instant
será truncado (perdido).
long millis = firstOfWeek.toInstant().toEpochMilli(); // Possible data loss.
Para obtener el primer día del mes, simplemente obtenga una Date
y establezca el día actual al día 1 del mes. Borrar la hora, minuto, segundo y milisegundos si lo necesita.
private static Date firstDayOfMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DATE, 1); return calendar.getTime(); }
El primer día de la semana es lo mismo, pero usando Calendar.DAY_OF_WEEK
lugar
private static Date firstDayOfWeek(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_WEEK, 1); return calendar.getTime(); }
En este caso:
// get today and clear time of day Calendar cal = Calendar.getInstance(); cal.clear(Calendar.HOUR_OF_DAY); <---- is the current hour not 0 hour cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND);
Así que el Calendar.HOUR_OF_DAY devuelve 8, 9, 12, 15, 18 como la hora actual. Creo que será mejor cambiar esta línea por:
c.set(Calendar.HOUR_OF_DAY,0);
De esta manera el día comienza siempre a las 0 horas
Usted debe ser capaz de convertir su número a un calendario de Java, por ejemplo:
Calendar.getInstance().setTimeInMillis(myDate);
A partir de ahí, la comparación no debe ser demasiado difícil.
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Scanner; /** This Program will display day for, 1st and last days in a given month and year @author Manoj Kumar Dunna Mail Id : [email protected] */ public class DayOfWeek { public static void main(String[] args) { String strDate = null; int year = 0, month = 0; Scanner sc = new Scanner(System.in); System.out.print("Enter YYYY/MM: "); strDate = sc.next(); Calendar cal = new GregorianCalendar(); String [] date = strDate.split("/"); year = Integer.parseInt(date[0]); month = Integer.parseInt(date[1]); cal.set(year, month-1, 1); System.out.println(new SimpleDateFormat("EEEE").format(cal.getTime())); cal.add(Calendar.MONTH, 1); cal.add(Calendar.DAY_OF_YEAR, -1); System.out.println(new SimpleDateFormat("EEEE").format(cal.getTime())); } }
Simple Solution: package com.util.calendarutil; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class CalUtil { public static void main(String args[]){ DateFormat df = new SimpleDateFormat("dd/mm/yyyy"); Date dt = null; try { dt = df.parse("23/01/2016"); } catch (ParseException e) { System.out.println("Error"); } Calendar cal = Calendar.getInstance(); cal.setTime(dt); cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); Date startDate = cal.getTime(); cal.add(Calendar.DATE, 6); Date endDate = cal.getTime(); System.out.println("Start Date:"+startDate+"End Date:"+endDate); } }
He creado algunos métodos para esto:
public static String catchLastDayOfCurrentWeek(String pattern) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); return calendarToString(cal, pattern); } public static String catchLastDayOfCurrentWeek(String pattern) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); cal.add(Calendar.WEEK_OF_YEAR, 1); cal.add(Calendar.MILLISECOND, -1); return calendarToString(cal, pattern); } public static String catchTheFirstDayOfThemonth(Integer month, pattern padrao) { Calendar cal = GregorianCalendar.getInstance(); cal.setTime(new Date()); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, 1); return calendarToString(cal, pattern); } public static String catchTheLastDayOfThemonth(Integer month, String pattern) { Calendar cal = GregorianCalendar.getInstance(); cal.setTime(new Date()); cal.set(cal.get(Calendar.YEAR), month, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); return calendarToString(cal, pattern); } public static String calendarToString(Calendar calendar, String pattern) { if (calendar == null) { return ""; } SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE); return format.format(calendar.getTime()); }
Puedes ver más aquí .
public static void main(String[] args) { System.out.println(getMonthlyEpochList(1498867199L,12,"Monthly")); } public static Map<String,String> getMonthlyEpochList(Long currentEpoch, int noOfTerms, String timeMode) { Map<String,String> map = new LinkedHashMap<String,String>(); int month = 0; while(noOfTerms != 0) { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, month); calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); Date monthFirstDay = calendar.getTime(); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); Date monthLastDay = calendar.getTime(); map.put(getMMYY(monthFirstDay.getTime()), monthFirstDay + ":" +monthLastDay); month--; noOfTerms--; } return map; }
- Cómo configurar Android Studio para trabajar completamente sin conexión?
- Ejemplos de patrones de diseño de Android MVVM