Я столкнулся с проблемой HackerRank, где я должен создать функцию, которая переводит строку в заданном формате времени в 12-часовом формате в 24-часовой формат.
Мне удалось сделать это с помощью приведенного ниже кода, но, как вы можете заметить, для 21:00 есть особый случай. Всякий раз, когда я вводил час, начинающийся с 09 (только этот проклятый), он преобразовывал 09 в 12. Поэтому мне пришлось фактически создать конкретный случай, чтобы обработать это, что сработало, но я хотел бы понять, почему это произошло. Вы знаете, в чем может быть проблема?
package main
import (
"fmt"
"strconv"
"strings"
)
type Conversion struct {
conversion string
}
func timeConversion(s string) string {
var conversion Conversion
firstValue := fmt.Sprintf("%s%s", string(s[0]), string(s[1]))
secondValue := fmt.Sprintf("%s%s", string(s[3]), string(s[4]))
firstValueNumber, _ := strconv.ParseInt(firstValue, 0, 16)
fmt.Print()
if strings.Contains(s, "A") {
if firstValue == "12" {
conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "00", secondValue, string(s[len(s)-4]), string(s[len(s)-3]))
} else {
conversion.conversion = fmt.Sprintf("%s:%s:%s%s", firstValue, secondValue, string(s[len(s)-4]), string(s[len(s)-3]))
}
} else if strings.Contains(s, "P") {
if firstValue == "12" {
conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "12", secondValue, string(s[len(s)-4]), string(s[len(s)-3]))
} else if firstValue == "09" {
conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "21", secondValue, string(s[len(s)-4]), string(s[len(s)-3]))
} else {
conversion.conversion = fmt.Sprintf("%d:%s:%s%s", firstValueNumber+12, secondValue, string(s[len(s)-4]), string(s[len(s)-3]))
}
}
return conversion.conversion
}
func main() {
fmt.Print(timeConversion("09:08:23PM"))
}
Никогда не игнорируйте ошибки!
Если вы обнаружите ошибку во время преобразования строки в int, вы заметите, что для значений >7
преобразование завершается ошибкой.
firstValueNumber, err := strconv.ParseInt(firstValue, 0, 64)
if err != nil {
fmt.Printf("%s", err.Error())
}
// "08" results in invalid syntaxfirstValueNumber being printed
Это происходит потому, что вы передаете 0 в качестве базы, говоря parseInt
вывести базу из первого символа строки. Ведущий '0'
подразумевает восьмеричное основание, поэтому цифры больше 7 будут недействительными. Вместо этого пройдите 10, и вам не понадобится специальная обработка.
Всегда начинайте с удаления ненужного (все, чего нет, не может вызвать проблем)
firstValue = s[:2]
, то же самое для второго значения. Тогда всегда обрабатывайте ошибки! Упростите код, используйте правильную функцию, не пытайтесь придумать: простая строка в int выполняется с помощью strconv.Atoi, а не ParseInt. Не забывайте всегда читать всю документацию по любой используемой вами функции (не угадывайте).