Wie erhalte ich den ersten Tag der aktuellen Woche und des aktuellen Monats?


74

Ich habe das Datum mehrerer Ereignisse in Millisekunden [1] angegeben und möchte wissen, welche Ereignisse sich in der aktuellen Woche und im aktuellen Monat befinden, kann jedoch nicht herausfinden, wie der erste Tag (Tag / Monat / Jahr) ermittelt werden kann ) der laufenden Woche und konvertieren Sie es in Millisekunden, das gleiche für den ersten Tag des Monats.

[1]Since January 1, 1970, 00:00:00 GMT

7
Wie bekomme ich den ersten Tag des Monats? Es ist die Nummerierte 1...
Michael Mrozek

Ja, aber wie bekommt man den Namen des ersten Tages des Monats?
Goran Horia Mihail

Antworten:


161

Diese Woche in Millisekunden:

// 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());

Diesen Monat in Millisekunden:

// 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());

benötigen auch clear am_pm für den Beginn eines Tages cal.clear (Calendar.AM_PM);
Keshin

@ Keshin: Stimmt. Ich ersetzen die Linien cal.clear(Calendar.HOUR_OF_DAY);mit cal.set(Calendar.HOUR_OF_DAY, 0);wie in der javadoc von Kalender angewiesen.
Kommen Sie vom

1
@COMEFROM Warum schlagen Sie die Verwendung von clear vor? Was ist der Vorteil bei Verwendung und welcher Fehler würde ich erwarten, wenn ich nicht verwende?
SpringLearner

@SpringLearner: Tage, Wochen und Monate beginnen und enden um Mitternacht. Calendar.getInstance gibt jedoch normalerweise keine Kalenderinstanz zurück, die auf Mitternacht (00: 00: 00.000) verweist. Um einen Anfang oder das Ende eines Tages (oder einer Woche oder eines Monats) herauszufinden, muss die Tageszeit zurückgesetzt werden.
Kommen Sie vom

@COMEFROM auch ich nicht klar dann auch es hat funktioniert so nur interessiert warum du es geschafft hast
SpringLearner

25

Der erste Wochentag kann mit Hilfe von java.util.Calendarwie folgt bestimmt werden:

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();

Der erste Tag des Monats kann wie folgt bestimmt werden:

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();

Ziemlich ausführlich, ja.


Java 7 wird mit einer stark verbesserten Datums- und Uhrzeit-API ( JSR-310 ) geliefert . Wenn Sie noch nicht wechseln können, können Sie JodaTime so weit wie möglich verwenden , was alles weniger kompliziert macht:

DateTime dateTime = new DateTime(timestamp);
long firstDayOfWeekTimestamp = dateTime.withDayOfWeek(1).getMillis();

und

DateTime dateTime = new DateTime(timestamp);
long firstDayOfMonthTimestamp = dateTime.withDayOfMonth(1).getMillis();

1
Vielen Dank, ich bin in der Entwicklung meiner ersten Android-App, in einer völlig neuen Welt, der Welt von Java, und ich hatte noch nie von joda gehört, bin mir aber bei joda + android nicht sicher. Danke noch einmal!
Cesarlinux

1
Bitte. Bei der Verwendung von JodaTime müssen Sie lediglich die JAR herunterladen und in den Klassenpfad einfügen. Wie bei jeder anderen "3rd Party" -Bibliothek.
BalusC

@cesar, wo sagst du in der Frage oder in den Tags, dass dies für Android ist?
Paul Tomblin

2
Beachten Sie jedoch, dass Jodatime Ihre 30-KB-App möglicherweise in eine 300-KB-App verwandelt.
Flodin

Gute Antwort. Ich schlage vor, auch ein DateTimeZone- Objekt an den DateTime-Konstruktor zu übergeben, anstatt sich implizit auf die aktuelle Standardzeitzone der JVM zu verlassen, die zugewiesen werden soll.
Basil Bourque

18

java.time

Das Java.time- Framework in Java 8 und höher ersetzt die alten Klassen java.util.Date/.Calendar. Die alten Klassen haben sich als lästig, verwirrend und fehlerhaft erwiesen. Vermeide sie.

Der java.time Rahmen wird durch die sehr erfolgreiche inspiriert Joda-Time Bibliothek, definiert durch JSR 310 , durch das erweiterten ThreeTen-Extra - Projekt, und erklärte im Tutorial .

Instant

Die InstantKlasse repräsentiert einen Moment auf der Zeitachse in UTC .

Das java.time-Framework hat eine Auflösung von Nanosekunden oder 9 Stellen einer Bruchsekunde. Millisekunden sind nur 3 Stellen einer Bruchsekunde. Da die Auflösung in Millisekunden üblich ist, enthält java.time eine praktische Factory-Methode.

long millisecondsSinceEpoch = 1446959825213L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );

MillisekundenSeitEpoch: 1446959825213 ist sofort: 2015-11-08T05: 17: 05.213Z

ZonedDateTime

Um die aktuelle Woche und den aktuellen Monat zu berücksichtigen, müssen wir eine bestimmte Zeitzone anwenden.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );

In zoneId: America / Montreal heißt das: 2015-11-08T00: 17: 05.213-05: 00 [America / Montreal]

Halb offen

In der Datums- und Zeitarbeit verwenden wir üblicherweise den Half-Open-Ansatz, um eine Zeitspanne zu definieren. Der Anfang ist inklusive, während das Ende exklusiv ist . Anstatt zu versuchen, den letzten Sekundenbruchteil des Wochenendes (oder Monats) zu bestimmen, erhalten wir den ersten Moment der folgenden Woche (oder des folgenden Monats). So eine Woche läuft vom ersten Moment an von Montag und geht nach oben , aber nicht einschließlich dem ersten Moment des folgenden Montags.

Lassen Sie uns den ersten und letzten Tag der Woche. Das java.time-Framework enthält ein Tool dafür, die withMethode und die ChronoFieldAufzählung.

Standardmäßig verwendet java.time den ISO 8601- Standard. Montag ist also der erste Tag der Woche (1) und Sonntag der letzte (7).

ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week.
ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );

Diese Woche läuft von: 2015-11-02T00: 17: 05.213-05: 00 [Amerika / Montreal] bis 2015-11-09T00: 17: 05.213-05: 00 [Amerika / Montreal]

Hoppla! Sehen Sie sich die Tageszeit für diese Werte an. Wir wollen den ersten Moment des Tages. Der erste Moment des Tages ist nicht immer 00:00:00.000auf die Sommerzeit (DST) oder andere Anomalien zurückzuführen. Deshalb sollten wir java.time die Anpassung in unserem Namen vornehmen lassen. Dazu müssen wir die LocalDateKlasse durchlaufen .

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 );

Diese Woche läuft von: 2015-11-02T00: 00-05: 00 [Amerika / Montreal] bis 2015-11-09T00: 00-05: 00 [Amerika / Montreal]

Und das Gleiche für den Monat.

ZonedDateTime firstOfMonth = zdt.with ( ChronoField.DAY_OF_MONTH , 1 );
firstOfMonth = firstOfMonth.toLocalDate ().atStartOfDay ( zoneId );
ZonedDateTime firstOfNextMonth = firstOfMonth.plusMonths ( 1 );

Dieser Monat läuft von: 2015-11-01T00: 00-04: 00 [Amerika / Montreal] bis 2015-12-01T00: 00-05: 00 [Amerika / Montreal]

YearMonth

Eine andere Möglichkeit, um festzustellen, ob sich zwei Momente im selben Monat befinden, besteht darin, nach demselben YearMonthWert zu suchen.

Nehmen wir zum Beispiel an thisZdtund thatZdtsind beide ZonedDateTimeObjekte:

boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;

Millisekunden

Ich empfehle dringend, Ihre Datums- und Zeitarbeit nicht in Millisekunden ab Epoche auszuführen. Das ist in der Tat die Art und Weise, wie Datums- und Zeitklassen intern arbeiten, aber wir haben die Klassen aus einem bestimmten Grund. Der Umgang mit einer Zählung aus der Epoche ist umständlich, da die Werte für den Menschen nicht verständlich sind und das Debuggen und Protokollieren schwierig und fehleranfällig ist. Und wie wir bereits gesehen haben, können unterschiedliche Auflösungen im Spiel sein. Alte Java-Klassen und die Joda-Time-Bibliothek verwenden Millisekunden, während Datenbanken wie Postgres Mikrosekunden verwenden und java.time jetzt Nanosekunden verwendet.

Würden Sie Text als Bits verarbeiten, oder lassen Sie sich Klassen wie String, StringBufferund StringBuildersolche Details behandeln?

Aber wenn Sie darauf bestehen, von einem ZonedDateTimeeine bekommen Instant, und von diesem erhalten einen Millisekunden-count-from-Epoche. Beachten Sie jedoch, dass dieser Aufruf zu Datenverlust führen kann . Alle Mikrosekunden oder Nanosekunden, die Sie möglicherweise in Ihrem ZonedDateTime/ Instanthaben, werden abgeschnitten (verloren).

long millis = firstOfWeek.toInstant().toEpochMilli();  // Possible data loss.

Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?


12

Beachtung!

while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) {
    calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week.
}

ist eine gute Idee, aber es gibt ein Problem: Zum Beispiel bin ich aus der Ukraine und calendar.getFirstDayOfWeek () in meinem Land ist 2 (Montag). Und heute ist 1 (Sonntag). In diesem Fall wird calendar.add nicht aufgerufen.

Der richtige Weg ist also, ">" in "! =" Zu ändern:

while (calendar.get(Calendar.DAY_OF_WEEK) != calendar.getFirstDayOfWeek()) {...

3

Um den ersten Tag des Monats zu erhalten, holen Sie sich einfach a Dateund setzen Sie den aktuellen Tag auf Tag 1 des Monats. Löschen Sie bei Bedarf Stunde, Minute, Sekunde und Millisekunden.

private static Date firstDayOfMonth(Date date) {
   Calendar calendar = Calendar.getInstance();
   calendar.setTime(date);
   calendar.set(Calendar.DATE, 1);
   return calendar.getTime();
}

Der erste Tag der Woche ist dasselbe, aber Calendar.DAY_OF_WEEKstattdessen

private static Date firstDayOfWeek(Date date) {
   Calendar calendar = Calendar.getInstance();
   calendar.setTime(date);
   calendar.set(Calendar.DAY_OF_WEEK, 1);
   return calendar.getTime();
}

Können Sie Vorschläge machen, wie Sie alle Wochentage extrahieren können, an denen das ausgewählte Datum vorhanden ist?
Rigorose Implementierung

import java.time.DayOfWeek; DayOfWeek[] daysOfWeek = DayOfWeek.values();
Ilja Tarasovs

2

Ich habe einige Methoden dafür erstellt:

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());
}

Sie können hier mehr sehen .


2

Sie können das java.timePaket (seit Java8 und spät) verwenden, um Start / Ende von Tag / Woche / Monat zu erhalten.
Das folgende Beispiel für eine util-Klasse:

import org.junit.Test;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

public class DateUtil {
    private static final ZoneId DEFAULT_ZONE_ID = ZoneId.of("UTC");

    public static LocalDateTime startOfDay() {
        return LocalDateTime.now(DEFAULT_ZONE_ID).with(LocalTime.MIN);
    }

    public static LocalDateTime endOfDay() {
        return LocalDateTime.now(DEFAULT_ZONE_ID).with(LocalTime.MAX);
    }

    public static boolean belongsToCurrentDay(final LocalDateTime localDateTime) {
        return localDateTime.isAfter(startOfDay()) && localDateTime.isBefore(endOfDay());
    }

    //note that week starts with Monday
    public static LocalDateTime startOfWeek() {
        return LocalDateTime.now(DEFAULT_ZONE_ID)
                .with(LocalTime.MIN)
                .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
    }

    //note that week ends with Sunday
    public static LocalDateTime endOfWeek() {
        return LocalDateTime.now(DEFAULT_ZONE_ID)
                .with(LocalTime.MAX)
                .with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
    }

    public static boolean belongsToCurrentWeek(final LocalDateTime localDateTime) {
        return localDateTime.isAfter(startOfWeek()) && localDateTime.isBefore(endOfWeek());
    }

    public static LocalDateTime startOfMonth() {
        return LocalDateTime.now(DEFAULT_ZONE_ID)
                .with(LocalTime.MIN)
                .with(TemporalAdjusters.firstDayOfMonth());
    }

    public static LocalDateTime endOfMonth() {
        return LocalDateTime.now(DEFAULT_ZONE_ID)
                .with(LocalTime.MAX)
                .with(TemporalAdjusters.lastDayOfMonth());
    }

    public static boolean belongsToCurrentMonth(final LocalDateTime localDateTime) {
        return localDateTime.isAfter(startOfMonth()) && localDateTime.isBefore(endOfMonth());
    }

    public static long toMills(final LocalDateTime localDateTime) {
        return localDateTime.atZone(DEFAULT_ZONE_ID).toInstant().toEpochMilli();
    }

    public static Date toDate(final LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(DEFAULT_ZONE_ID).toInstant());
    }

    public static String toString(final LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ISO_DATE_TIME);
    }

    @Test
    public void test() {
        //day
        final LocalDateTime now = LocalDateTime.now();
        System.out.println("Now: " + toString(now) + ", in mills: " + toMills(now));
        System.out.println("Start of day: " + toString(startOfDay()));
        System.out.println("End of day: " + toString(endOfDay()));
        System.out.println("Does '" + toString(now) + "' belong to the current day? > " + belongsToCurrentDay(now));
        final LocalDateTime yesterday = now.minusDays(1);
        System.out.println("Does '" + toString(yesterday) + "' belong to the current day? > " + belongsToCurrentDay(yesterday));
        final LocalDateTime tomorrow = now.plusDays(1);
        System.out.println("Does '" + toString(tomorrow) + "' belong to the current day? > " + belongsToCurrentDay(tomorrow));
        //week
        System.out.println("Start of week: " + toString(startOfWeek()));
        System.out.println("End of week: " + toString(endOfWeek()));
        System.out.println("Does '" + toString(now) + "' belong to the current week? > " + belongsToCurrentWeek(now));
        final LocalDateTime previousWeek = now.minusWeeks(1);
        System.out.println("Does '" + toString(previousWeek) + "' belong to the current week? > " + belongsToCurrentWeek(previousWeek));
        final LocalDateTime nextWeek = now.plusWeeks(1);
        System.out.println("Does '" + toString(nextWeek) + "' belong to the current week? > " + belongsToCurrentWeek(nextWeek));
        //month
        System.out.println("Start of month: " + toString(startOfMonth()));
        System.out.println("End of month: " + toString(endOfMonth()));
        System.out.println("Does '" + toString(now) + "' belong to the current month? > " + belongsToCurrentMonth(now));
        final LocalDateTime previousMonth = now.minusMonths(1);
        System.out.println("Does '" + toString(previousMonth) + "' belong to the current month? > " + belongsToCurrentMonth(previousMonth));
        final LocalDateTime nextMonth = now.plusMonths(1);
        System.out.println("Does '" + toString(nextMonth) + "' belong to the current month? > " + belongsToCurrentMonth(nextMonth));
    }
}

Testausgabe:

Now: 2020-02-16T22:12:49.957, in mills: 1581891169957
Start of day: 2020-02-16T00:00:00
End of day: 2020-02-16T23:59:59.999999999
Does '2020-02-16T22:12:49.957' belong to the current day? > true
Does '2020-02-15T22:12:49.957' belong to the current day? > false
Does '2020-02-17T22:12:49.957' belong to the current day? > false
Start of week: 2020-02-10T00:00:00
End of week: 2020-02-16T23:59:59.999999999
Does '2020-02-16T22:12:49.957' belong to the current week? > true
Does '2020-02-09T22:12:49.957' belong to the current week? > false
Does '2020-02-23T22:12:49.957' belong to the current week? > false
Start of month: 2020-02-01T00:00:00
End of month: 2020-02-29T23:59:59.999999999
Does '2020-02-16T22:12:49.957' belong to the current month? > true
Does '2020-01-16T22:12:49.957' belong to the current month? > false
Does '2020-03-16T22:12:49.957' belong to the current month? > false

Vielen Dank für die gründliche Demonstration. Zwei Vorschläge: (1) Bevorzugen Sie ZonedDateTimeoder OffsetDateTimefür ein Datum und eine Uhrzeit, die einen festen Punkt auf der Zeitachse darstellen müssen. (2) Definieren Sie das Ende des Tages als den ersten Moment des nächsten exklusiven Tages und definieren Sie den Tag (und damit die Woche und den Monat) als halboffenes Intervall. Es ist korrekter (ohne die letzte Nanosekunde des Tages auszuschließen) und liefert manchmal einfacheren Code.
Ole VV

1

In diesem Fall:

// 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);

Der Calendar.HOUR_OF_DAY gibt also 8, 9, 12, 15, 18 als aktuelle Betriebsstunde zurück. Ich denke, es wird besser sein, diese Linie zu ändern, indem:

c.set(Calendar.HOUR_OF_DAY,0);

Auf diese Weise beginnt der Tag immer um 0 Uhr


1

Erhalten Sie das erste Datum des nächsten Monats : -

SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy");
String selectedDate="MM-dd-yyyy like 07-02-2018";
Date dt = df.parse(selectedDate);`enter code here`
calendar = Calendar.getInstance();
calendar.setTime(dt);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1);

String firstDate = df.format(calendar.getTime());
System.out.println("firstDateof next month ==>" + firstDate);

0

Sie sollten in der Lage sein, Ihre Nummer in einen Java-Kalender umzuwandeln, z.

 Calendar.getInstance().setTimeInMillis(myDate);

Von dort sollte der Vergleich nicht zu schwierig sein.


0
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()));
    }
}

0
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);


    }

}

0

Eine einzeilige Lösung mit Java 8-Funktionen

In Java

LocalDateTime firstOfWeek = LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 1).toLocalDate().atStartOfDay(); // 2020-06-08 00:00 MONDAY
LocalDateTime firstOfMonth = LocalDateTime.now().with(ChronoField.DAY_OF_MONTH , 1).toLocalDate().atStartOfDay(); // 2020-06-01 00:00
// Convert to milliseconds: 
firstOfWeek.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

In Kotlin

val firstOfWeek = LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 1).toLocalDate().atStartOfDay() // 2020-06-08 00:00 MONDAY
val firstOfMonth = LocalDateTime.now().with(ChronoField.DAY_OF_MONTH , 1).toLocalDate().atStartOfDay() // 2020-06-01 00:00
// Convert to milliseconds: 
firstOfWeek.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()

Irgendwelche Ideen, wie man LocalDateTimeeinfacher in Millisekunden konvertiert ?
Daniel

1
Ah, Ihre Idee wäre also, die Millisekundenwerte zu vergleichen? Ich würde zu vergleichen bevorzugen InstantObjekte ihre Verwendung isBefore, isEqualoder isAfterVerfahren. Sie erhalten einen Augenblick trivial von Instant.ofEpochMilli(someMillisecondValue). Und ja, der einfachere Weg, ein zu konvertieren, LocalDateTimeist firstOfWeek.atZone(ZoneId.systemDefault()).toInstant().
Ole VV

-1

Ich benutze diesen Trick, um den ersten Tag des aktuellen Monats zu erhalten. Beachten Sie, dass die Reihenfolge 1 für Sonntag 2 für Montag 3 für Dienstag ist .... und so weiter

Calendar cal = new GregorianCalendar();
int startDay = cal.get(Calendar.DAY_OF_YEAR) % 7 + 1;
System.out.println(startDay);

1
Zu Ihrer Information, die störenden Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe, durch die verdrängte java.time Klassen. Die meisten Funktionen von java.time werden im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für früheres Android (<26) in ThreeTenABP . Siehe Verwendung von ThreeTenABP… .
Basil Bourque

Ich glaube nicht, dass Sie die Frage beantworten. Vielleicht eine andere Frage.
Ole VV

Es funktioniert auch nicht. Ich habe heute, Mittwoch, Ihren Code ausgeführt 3, was Ihrer Meinung nach für Dienstag sein sollte.
Ole VV

-4
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;     
}

3
Können Sie uns sagen, warum Sie dies als Antwort hinzufügen?
Birwin

Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleTextFormatsind jetzt Erbe , durch die verdrängte java.time Klassen. Siehe Tutorial von Oracle .
Basil Bourque
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.