Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿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 

  • ¿Cómo puedo pasar varios parámetros en la URL?
  • Descomprimir un archivo zip ... Archivo no encontrado excepción
  • Mejor manera de evitar el código duplicado si dos clases que se extienden de diferentes clases
  • Cómo fusionar la aplicación de cliente OpenVPN con otra aplicación para Android?
  • ¿Cómo puedo suprimir nuevo anónimo runnable () se puede sustituir por lambda
  • La aplicación se bloquea cuando ejecuto Proguard en GSON (que utiliza enum)
  • R.drawable no puede resolver la imagen
  • ¿Cómo esperar que todas las tareas en un ThreadPoolExecutor terminen sin apagar el Ejecutor?
  • 11 Solutions collect form web for “¿Cómo obtener el primer día de la semana y mes actuales?”

    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 : manojdunna@gmail.com */ 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; } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.