2017-09-19 10 views
2

せずに任意のアイデアを、日付を解析します。もちろんセパレータ

date, err := time.Parse("1206", "31916") 
fmt.Println(date, err) 

私はそれをやっているように3とない31として月扱いたいが、私は形式にセパレータを追加する外ヶ月間3で停止し、それを強制するかどうかはわかりません。例えば

+0

申し訳ありません私はあなたのフォーマットを取得していません..どの日が '31916'ですか?あなたは2016年3月19日のようにしていますか? – Vasif

+0

奇妙な考え方として、書式を '1 2 06'に変更し、' 31916'のすべての順列をスペースで生成することができます。それはちょうど16の組合せである。次に、それぞれを確認します。 – zerkms

答えて

5

package main 

import (
    "fmt" 
    "time" 
) 

func parseDate(date string) (time.Time, error) { 
    if len(date) == 5 { 
     date = "0" + date 
    } 
    return time.Parse("010206", date) 

} 

func main() { 
    date, err := parseDate("31916") 
    fmt.Println(date, err) 
    date, err = parseDate("031916") 
    fmt.Println(date, err) 
    date, err = parseDate("121916") 
    fmt.Println(date, err) 
} 

出力:

2016-03-19 00:00:00 +0000 UTC <nil> 
2016-03-19 00:00:00 +0000 UTC <nil> 
2016-12-19 00:00:00 +0000 UTC <nil> 
4

あなたがすることはできません。あなたが渡すレイアウトは確定的ではありません。月が終わり、文字列で始まる日を知る方法はありません。一方のオプションが失敗し、もう一方が失敗した場合("11106" - と思います)は1\11\06または11\1\06? )。あなたの最善の策は、選択が確定的になりラッパーを書くことである:ここ

import (
    "time" 
    "strconv" 
) 

func parseWeirdLayout(dateString string) (time.Time, error) { 
    parsedString := "" 
    if len(dateString) == 5 { 
    month, err := strconv.Atoi(dateString[0:2]) 
    if err != nil { 
     return time.Now(), err 
    } 
    if month < 1 || month > 12 { 
     parsedString = "0" + dateString 
    } else { 
     parsedString = dateString[:2] + "0" + dateString[2:] 
    } 
    } else if len(dateString) == 4 { 
    parsedString = "0" + dateString[:1] + "0" + dateString[1:] 
    } 

    return time.Parse("010206", parsedString) 
} 

テスト:https://play.golang.org/p/u1QFPzehMj

あるいは単に異なる、決定論的なレイアウトを使用して、例えば"010206"

関連する問題