首頁  >  文章  >  後端開發  >  Go 小時轉換演算法未正確轉換

Go 小時轉換演算法未正確轉換

WBOY
WBOY轉載
2024-02-14 10:00:09734瀏覽

Go 小时转换算法未正确转换

php小編新一今天要跟大家介紹的是Go語言中的一個問題,也就是「Go 小時轉換演算法未正確轉換」。在Go語言中,時間轉換是一個常見的操作,但是在某些情況下,小時轉換的結果可能會出現錯誤。本文將詳細解釋這個問題的原因,並提供解決方案,幫助開發者避免在使用Go語言進行時間轉換時發生錯誤。

問題內容

我遇到了一個 hackerrank 挑戰,我應該建立一個函數,將給定時間格式的字串從 12 小時格式轉換為 24 小時格式。

我設法使用下面的程式碼做到了這一點,但正如您所注意到的,晚上 9 點有一個特殊情況。每當我輸入以 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 就不需要特殊處理。

以上是Go 小時轉換演算法未正確轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除