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.
Wyzwanie
ŁatwyUtwó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:
- Przetworzyć pierwsze dane wejściowe, dzieląc je po przecinkach, aby uzyskać poszczególne wpisy wydarzeń
- Dla każdego wpisu wydarzenia podzielić go po dwukropkach, aby wyodrębnić nazwę wydarzenia, rok, miesiąc, dzień, godzinę i minutę
- Przekonwertować ciągi znaków z liczbami na liczby całkowite i utworzyć obiekt
time.Timeza pomocątime.Datedla każdego wydarzenia (użyćtime.UTCjako parametru lokalizacji oraz 0 dla sekund i nanosekund) - Wyświetlić nagłówek aplikacji:
"=== HISTORICAL TIMELINE APPLICATION ===" - Wyświetlić potwierdzenie wczytywania wydarzeń:
"Loading historical events..." - Dla każdego wydarzenia wyświetlić:
"Loaded: [event_name] - [complete_time_object]" - Przetworzyć drugie dane wejściowe, dzieląc je po przecinkach, aby uzyskać opcje wyświetlania
- 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]" - 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
}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