Moi,
Luen input tiedostosta alla olevalla koodilla päivämäärän pickeriin.
datetimepicker_date.Value = CType(sr.ReadLine(), Date)
Toimii hienosti kun avaan omia tekemiä tiedostoja. Mutta kun avaan kiinan maa asetuksilla tehtyjä tiedostoja. Tulee error ei osaa castata, muoto väärä!
Miten voisin castata tuon niin että päivämäärä voi olla minkä tahansa maa-asetuksen mukainen ja se kääntää sen omalle maa-asetukselle sopivaksi?
Input tiedostossa ei ole tietoa millä maa asetuksilla tehty, joten se pitää arvata jotenkin päiväämärän muodosta.
Entä jos pakottaisit standardin mukaiseen merkintään? Olisi helpompi elää, kun data tulee strukturoidussa muodossa sisään. Toinen vaihtoehto on lisätä sopiva metadata datan muodosta. Miten esimerkiksi tulkitset päivämäärän "2013-03-04 12:00:50" vs "3.4.2013 12:00:50" tai ehkä joku haluaa ilmaista sen näin "4.3.2013 12:00:50" Et voi siis pelkän datan perusteella päätellä muodosta täysin varmaksi haluttua aikaleimaa.
Isoin ongelma on siinä että tuo päivämäärä on tehty tyhmästi alunperin.
Nyt kuitenkin laskentoja on tehty ja ne vanhatkin pitäisi saada auki.
Alla olevalla saa castattua mutta ainakin UK ja US menevät väärin
' kiina intia uk us turkki suomi Dim dateStrings() As String = {"2013/10/11 14:37:00", "11-10-2013 14:35:55", "10/11/2013 2:37:40 PM", "10/11/2013 2:40:02 PM", "11.10.2013 14:41:27", "30.9.2013 14:46:25"} Dim dateValue As Date Console.WriteLine("Attempting to parse strings using {0} culture.", _ CultureInfo.CurrentCulture.Name) For Each dateString As String In dateStrings If Date.TryParse(dateString, dateValue) Then Console.WriteLine(" Converted '{0}' to {1} ({2}).", dateString, _ dateValue, dateValue.Kind) Else Console.WriteLine(" Unable to parse '{0}'.", dateString) End If Next Console.Read() 'Attempting to parse strings using fi-FI culture. 'Converted() '2013/10/11 14:37:00' to 11.10.2013 14:37:00 (Unspecified). 'Converted() '11-10-2013 14:35:55' to 11.10.2013 14:35:55 (Unspecified). 'Converted() '10/11/2013 2:37:40 PM' to 10.11.2013 14:37:40 (Unspecified). 'Converted() '10/11/2013 2:40:02 PM' to 10.11.2013 14:40:02 (Unspecified). 'Converted() '11.10.2013 14:41:27' to 11.10.2013 14:41:27 (Unspecified). 'Converted() '30.9.2013 14:46:25' to 30.9.2013 14:46:25 (Unspecified).
Lisäys:
Alkuperäisiin tiedostoihin tulee päivämäärä DateTimePickerin kautta joten päivämäärät ovat sentään jossain vakio muodossa. Kuten yllä olevassa esimerkissä.
Pystyisinkö lukemaan .txt input filestä muutospäivämäärän, se luultavasti olisi automaattisesti aina maa kohtainen?
Päivämäärän ainoa tarkoitus on näyttää koska laskenta on talennettu.
Pystyykö tiedoston nimestä tekemään päätelmiä missä maassa kyseinen tiedosto on tuotettu? Mikäli näin on voidaan ohjelmaan luoda säännöt eri maille lukemisen tueksi. Luetaanko vanhoja datoja useinkin, eli olisiko järkevää konvertoida ensin kaikki datat vakiomuotoon?
Jatkon kannalta data johonkin vakioituun muotoon ja aikaleimat UTC-aikaan, jolloin aikavyöhyke ja mahdolliset talvi- ja kesäajat eivät sotke laskuja.
http://www.codeproject.com/Articles/11201/
Dim fileName As String = "C:\MyPath\MyFile.txt" If File.Exists(fileName) Then Label_CreationTime.Text = File.GetCreationTime(fileName).ToString Label_LastAccess.Text = File.GetLastAccessTime(fileName).ToString Label_LastWrite.Text = File.GetLastWriteTime(fileName).ToString End If
Olen myös tuon oppinut kantapään kautta, että ei kannata käyttää tallennuksessa
datetime.ToString()
silloin tosiaan menee siinä muodossa, mihinkä maahan kone on lokalisoitu. Tämä tuntuu toimivan globaalisti:
datetime.ToString(CultureInfo.InvariantCulture)
(löytyiköhän tuo CultureInfo nyt System.Globalization nimiavaruudesta)
Sama homma tulee vastaan myös reaalilukujen kanssa. Suomessa tuppaa tulemaan pilkku erottimeksi, joka ei esimerkiksi Kiinassa toimi :) Itseasiassa juuri tämän opin kantapään kautta, päivämäärät ja ajat tulee aina laitettua automaattisesti "standardiin formaattiin"
Jep, onneksi tuon pilkun ja pisteen tajusin hoitaa heti alusta asti, mutta kun päivämäärällä ollut mitään järkevää toimintoa se jäi hieman toissijaiseksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.