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 trzeba pracować z określonymi datami i godzinami. Go udostępnia funkcję time.Date, która tworzy obiekt time.Time reprezentujący dowolną wskazaną przez Ciebie datę i godzinę.
Funkcja time.Date przyjmuje osiem parametrów w dokładnie tej kolejności: rok, miesiąc, dzień, godzinę, minutę, sekundę, nanosekundę i lokalizację. 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 dla miesięcy, dzięki czemu Twój 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 Twojego 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 obiekt z time.Now() i można go używać do tych samych operacji na czasie.
Wyzwanie
ŁatwyUtwórz aplikację przedstawiającą oś czasu wydarzeń historycznych, która używa time.Date do reprezentowania konkretnych dat i godzin z historii. To wyzwanie sprawdzi Twoją umiejętność tworzenia obiektów time.Time dla precyzyjnie określonych momentów historycznych i wyświetlania ich w uporządkowanym formacie.
Otrzymasz dwa wejścia:
- 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:
- Przeanalizuj pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne wpisy wydarzeń
- Dla każdego wpisu wydarzenia podziel go po dwukropkach, aby wyodrębnić nazwę wydarzenia, rok, miesiąc, dzień, godzinę i minutę
- Przekonwertuj ciągi znaków zawierające liczby na liczby całkowite i utwórz obiekt
time.Timeza pomocątime.Datedla każdego wydarzenia (użyjtime.UTCjako parametru lokalizacji oraz 0 dla sekund i nanosekund) - Wyświetl nagłówek aplikacji:
"=== HISTORICAL TIMELINE APPLICATION ===" - Wyświetl potwierdzenie wczytywania wydarzeń:
"Loading historical events..." - Dla każdego wydarzenia wyświetl:
"Loaded: [event_name] - [complete_time_object]" - Przeanalizuj drugie wejście, dzieląc je po przecinkach, aby uzyskać opcje wyświetlania
- Przetwórz każdą opcję wyświetlania:
- Dla
"chronological": Wyświetl"=== 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świetl"=== DETAILED INFORMATION ===", a następnie każde wydarzenie w następującym formacie:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- Dla
"summary": Wyświetl"=== 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świetl"=== EVENTS BY DECADE ===", a następnie wydarzenia pogrupowane według dekad, w formacie"[decade]s: [comma_separated_event_names]" - Wyświetl komunikat o zakończeniu:
"Historical timeline processing completed"
Użyj pakietu time, aby tworzyć konkretne daty za pomocą time.Date, pakietu strings, aby dzielić wejściowe ciągi znaków, pakietu strconv, aby konwertować ciągi znaków zawierające liczby na liczby całkowite, oraz pakietu fmt do formatowania danych wyjściowych. Pamiętaj, że time.Date przyjmuje parametry w dokładnie tej 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 odwołaniem się do elementów wycinka parts sprawdzić, czy jest ich wystarczająco dużo
// 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
}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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania7Obsługa błędów — dogłębnie
Własne typy błędówOpakowywanie błędów za pomocą `%w`Rozpakowywanie za pomocą `errors.Is`Rozpakowywanie za pomocą `errors.As`Zrozumienie `panic`Używanie `recover`Podsumowanie — bezpieczne dzielenie10Praca z czasem
Pobieranie bieżącego czasuTworzenie określonej godzinyFormatowanie czasuParsowanie ciągów czasuCzas trwaniaOperacje arytmetyczne na czasieUśpienia i tickeryPodsumowanie — prosty timer2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online