Menu
CoddyTech

Tworzenie określonej godziny

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 59 z 68.

Chociaż time.Now() zwraca bieżący moment, często będziesz potrzebować pracować z konkretnymi datami i godzinami. Go udostępnia funkcję time.Date, która tworzy obiekt time.Time reprezentujący dowolną podaną przez Ciebie datę i godzinę.

Funkcja time.Date przyjmuje osiem parametrów w dokładnie tej kolejności: rok, miesiąc, dzień, godzina, minuta, sekunda, nanosekunda i lokalizacja. Oto podstawowa składnia:

birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)

Zwróć uwagę, że Go używa stałych, takich jak time.March, do oznaczania miesięcy, dzięki czemu kod jest bardziej czytelny niż w przypadku używania liczb. Jeśli wolisz, możesz też używać liczb całkowitych (1-12). Parametr lokalizacji zazwyczaj przyjmuje wartość time.UTC dla czasu UTC lub time.Local dla lokalnej strefy czasowej systemu.

To podejście daje Ci pełną kontrolę nad tworzeniem dowolnego konkretnego momentu w czasie, niezależnie od tego, czy jest to urodziny, termin czy data historyczna. Otrzymany obiekt time.Time działa dokładnie tak samo jak ten z time.Now() i można go używać ze wszystkimi tymi samymi operacjami na czasie.

challenge icon

Wyzwanie

Łatwy

Utwórz aplikację przedstawiającą oś czasu wydarzeń historycznych, która używa time.Date do reprezentowania konkretnych dat i godzin z przeszłości. To wyzwanie sprawdzi, czy potrafisz tworzyć obiekty time.Time dla dokładnie określonych momentów historycznych i wyświetlać je w uporządkowanym formacie.

Otrzymasz dwa dane wejściowe:

  • Ciąg znaków zawierający wydarzenia historyczne w formacie "event1:year:month:day:hour:minute,event2:year:month:day:hour:minute" (np. "Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0")
  • Ciąg znaków zawierający opcje wyświetlania oddzielone przecinkami w formacie "option1,option2,option3" (np. "chronological,details,summary")

Twoje zadanie:

  1. Przetworzyć pierwsze dane wejściowe, dzieląc je po przecinkach, aby uzyskać poszczególne wpisy wydarzeń
  2. Dla każdego wpisu wydarzenia podzielić go po dwukropkach, aby wyodrębnić nazwę wydarzenia, rok, miesiąc, dzień, godzinę i minutę
  3. Przekonwertować ciągi znaków z liczbami na liczby całkowite i utworzyć obiekt time.Time za pomocą time.Date dla każdego wydarzenia (użyć time.UTC jako parametru lokalizacji oraz 0 dla sekund i nanosekund)
  4. Wyświetlić nagłówek aplikacji: "=== HISTORICAL TIMELINE APPLICATION ==="
  5. Wyświetlić potwierdzenie wczytywania wydarzeń: "Loading historical events..."
  6. Dla każdego wydarzenia wyświetlić: "Loaded: [event_name] - [complete_time_object]"
  7. Przetworzyć drugie dane wejściowe, dzieląc je po przecinkach, aby uzyskać opcje wyświetlania
  8. Przetworzyć każdą opcję wyświetlania:
    • Dla "chronological": Wyświetlić "=== CHRONOLOGICAL ORDER ===", a następnie wydarzenia posortowane według daty (od najwcześniejszego), w formacie "[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC"
    • Dla "details": Wyświetlić "=== DETAILED INFORMATION ===", a następnie poniższe wiersze dla każdego wydarzenia (ostatnie cztery mają dwa początkowe odstępy):
      Event: [event_name]
        Date: [year]-[month]-[day]
        Time: [hour]:[minute] UTC
        Weekday: [weekday_name]
        Unix timestamp: [unix_seconds]
    • Dla "summary": Wyświetlić "=== TIMELINE SUMMARY ===", a następnie:
      • "Total events: [number_of_events]"
      • "Earliest event: [earliest_event_name] ([year])"
      • "Latest event: [latest_event_name] ([year])"
      • "Time span: [years_between_earliest_and_latest] years"
    • Dla "years": Wyświetlić "=== EVENTS BY DECADE ===", a następnie wydarzenia pogrupowane według dekad, w formacie "[decade]s: [comma_separated_event_names]"
  9. Wyświetlić komunikat o zakończeniu: "Historical timeline processing completed"

Zasady formatowania: wiersz Loaded: wyświetla wartość time.Time tak, jak jest, za pomocą %v, na przykład Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. Wszystkie pozostałe daty i godziny są składane ręcznie: miesiąc, dzień i godzina nie mają zera wiodącego, a minuta zawsze ma dwie cyfry (%02d), więc to samo wydarzenie zostanie wyświetlone jako Moon Landing: 1969-7-20 at 20:17 UTC, a minuta 0 jako 21:00. [unix_seconds] to Unix(), którego wartość jest ujemna dla dat sprzed 1970 roku. Na liście dekad dekady są uporządkowane od najwcześniejszej do najpóźniejszej, a nazwy wydarzeń w każdej dekadzie są łączone przecinkiem bez spacji, w kolejności z danych wejściowych.

Użyj pakietu time, aby utworzyć konkretne daty za pomocą time.Date, pakietu strings, aby podzielić ciągi wejściowe, pakietu strconv, aby przekonwertować ciągi z liczbami na liczby całkowite, oraz pakietu fmt do formatowanego wyjścia. Pamiętaj, że time.Date przyjmuje parametry w dokładnie takiej kolejności: rok, miesiąc, dzień, godzina, minuta, sekunda, nanosekunda, lokalizacja. Aby sortować chronologicznie, możesz porównywać obiekty time.Time za pomocą metody Before(). To wyzwanie pokazuje, jak tworzyć konkretne momenty w czasie i pracować z danymi historycznymi, korzystając z funkcji obsługi czasu w Go.

Spróbuj swoich sił

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Odczytaj dane wejściowe za pomocą bufio.Scanner, aby poprawnie obsłużyć spacje
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	eventsInput := scanner.Text()
	
	scanner.Scan()
	optionsInput := scanner.Text()
	
	// Przeanalizuj zdarzenia z danych wejściowych
	eventEntries := strings.Split(eventsInput, ",")
	
	// Przeanalizuj opcje wyświetlania z danych wejściowych
	displayOptions := strings.Split(optionsInput, ",")
	
	// TODO: Napisz swój kod poniżej
	// 1. Przeanalizuj każdy wpis zdarzenia, aby wyodrębnić nazwę, rok, miesiąc, dzień, godzinę i minutę
	// 2. Pamiętaj, aby przed uzyskaniem dostępu do wycinka parts sprawdzić, czy zawiera wystarczającą liczbę elementów
	// 3. Przekonwertuj liczby zapisane jako ciągi znaków na liczby całkowite za pomocą strconv.Atoi()
	// 4. Utwórz obiekty time.Time za pomocą time.Date() dla każdego zdarzenia
	// 5. Wyświetl nagłówek aplikacji i komunikaty o ładowaniu
	// 6. Przetwórz każdą opcję wyświetlania (chronological, details, summary, years)
	// 7. Wyświetl komunikat o zakończeniu
	
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online