java - novilunio - luna nueva visible
¿Cómo obtener el nombre del primer día de un mes? (8)
java.time
Desde Java 8 también podemos usar la clase YearMonth
que nos permite crear objetos LocalDate
con días específicos (primero, último). Luego, podemos simplemente convertir estas fechas a DayOfWeek
Enum ( Tutorial ) y leer su propiedad de name
.
YearMonth ym = YearMonth.of(2012, 1);
String firstDay = ym.atDay(1).getDayOfWeek().name();
String lastDay = ym.atEndOfMonth().getDayOfWeek().name();
System.out.println(firstDay);
System.out.println(lastDay);
resultado:
SUNDAY
TUESDAY
¿Cómo haría para obtener el primer día del mes? Así que para enero, de este año, volvería el domingo. Y luego para febrero volvería el miércoles.
java.time, codificado suave
La Answer de Pshemo fue buena e inteligente, pero está codificada al inglés. Vamos a echarle un vistazo para permitir la localización.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Time zone is crucial to determining a date.
YearMonth yearMonth = YearMonth.now( zoneId );
LocalDate firstOfMonth = yearMonth.atDay( 1 );
Formateador
Generar una representación textual de ese LocalDate
. Especificamos la CANADA_FRENCH
Locale
deseada, en este caso CANADA_FRENCH
. Si se omite, la configuración regional predeterminada actual de su JVM se aplica implícitamente; Mejor especificar locale explícito.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE" ).withZone( zoneId ).withLocale( Locale.CANADA_FRENCH ); // Exactly four ''E'' letters means full form. http://docs.oracle.com/javase/8/docs/api/java/time/format/TextStyle.html#FULL
String output = formatter.format( firstOfMonth );
Volcar a la consola.
System.out.println( "output: " + output );
Cuando se ejecuta
samedi
DayOfWeek
Enum
Otra ruta es utilizar la enumeración DayOfWeek
. Esta enumeración incluye un método getDisplayName
donde se especifica el estilo de texto (nombre completo versus abreviatura) y una Locale
.
DayOfWeek dayOfWeek = firstOfMonth.getDayOfWeek() ;
String output = dayOfWeek.getDisplayName( TextStyle.FULL_STANDALONE , Locale.CANADA_FRENCH ) ;
TemporalAdjuster
En java 8 puede usar la nueva LocalDate y LocalTime API.
Para lograr el codiciado resultado, intente lo siguiente. Imprime el nombre del día dado.
import java.time.*;
import java.time.temporal.*;
public class Main {
public static void main(String[] args) {
LocalDate l = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
System.out.println(l.getDayOfWeek());
}
}
Explicación:
-
now
te da la fecha actual. - Al llamar
with
usted puede pasar unTemporalAdjuster
que es una herramienta clave para modificar objetos temporales. -
getDayOfWeek
Obtiene el campo del día de la semana, que es una enumeraciónDayOfWeek
. Esto incluye nombres textuales de los valores.
TemporalAdjuster
tiene una clase hermana, llamada TemporalAdjusters
que contiene métodos estáticos con respecto a los ajustes, como el que está buscando, el firstDayOfMonth
día de firstDayOfMonth
Cree el objeto java.util.Date
o java.util.Calendar
, establezca el valor de la fecha y use el método de clase java.text.SimpleDateFormat
para formatearlo.
Calendar cal=Calendar.getInstance();
cal.set(Calendar.DATE,1);
cal.set(Calendar.MONTH,0);
cal.set(Calendar.YEAR,2012);
SimpleDateFormat sdf=new SimpleDateFormat("EEEE");
System.out.println(sdf.format(cal.getTime()));
En el Java 8 puedes usar los Ajustadores Temporales:
Esto es un ejemplo:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
/**
* Dates in Java8
*
*/
public class App {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
System.out.println("Day of Month: " + localDate.getDayOfMonth());
System.out.println("Month: " + localDate.getMonth());
System.out.println("Year: " + localDate.getYear());
System.out.printf("first day of Month: %s%n",
localDate.with(TemporalAdjusters.firstDayOfMonth()));
System.out.printf("first Monday of Month: %s%n", localDate
.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
System.out.printf("last day of Month: %s%n",
localDate.with(TemporalAdjusters.lastDayOfMonth()));
System.out.printf("first day of next Month: %s%n",
localDate.with(TemporalAdjusters.firstDayOfNextMonth()));
System.out.printf("first day of next Year: %s%n",
localDate.with(TemporalAdjusters.firstDayOfNextYear()));
System.out.printf("first day of Year: %s%n",
localDate.with(TemporalAdjusters.firstDayOfYear()));
LocalDate tomorrow = localDate.plusDays(1);
System.out.println("Day of Month: " + tomorrow.getDayOfMonth());
System.out.println("Month: " + tomorrow.getMonth());
System.out.println("Year: " + tomorrow.getYear());
}
}
Los resultados serían:
Day of Month: 16
Month: MAY
Year: 2014
first day of Month: 2014-05-01
first Monday of Month: 2014-05-05
last day of Month: 2014-05-31
first day of next Month: 2014-06-01
first day of next Year: 2015-01-01
first day of Year: 2014-01-01
Last in Month Tuesday: 2014-05-27
Day of Month: 17
Month: MAY
Year: 2014
Puede crear un Calendar
con la fecha que desee y luego set(Calendar.DAY_OF_MONTH, 1)
para obtener el primer día de un mes.
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 25);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.YEAR, 2012);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date firstDayOfMonth = cal.getTime();
DateFormat sdf = new SimpleDateFormat("EEEEEEEE");
System.out.println("First Day of Month: " + sdf.format(firstDayOfMonth));
Para obtener la primera fecha del mes actual, use java.util.Calendar
. Primero obtenga una instancia del mismo y configure el campo Calendar.DAY_OF_MONTH
en la primera fecha del mes. Como el primer día de cualquier mes es 1, en lugar de cal.getActualMinimum(Calendar.DAY_OF_MONTH)
, se puede usar 1 aquí.
private Date getFirstDateOfCurrentMonth() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
return cal.getTime();
}
public int getFirstDay(){
Calendar c=new GregorianCalendar();
c.set(Calendar.DAY_OF_MONTH, 1);
return c.get(Calendar.DAY_OF_WEEK);
}
Desde allí puede ver si el int es igual a Calendar.SUNDAY, Calendar.MONDAY, etc.