Is there universal date format for CSV that can be exported and easily translated in eg. Excel (with different cultures: US, UK, India etc.) ?
My system renders CSV file with US date format but Excel in other cultures can't handle it.
Maybe is possible to convert time from ticks.
I think the answer is No, if only because Excel itself may use either the 1900 or the 1904 date system. Your best bet may be to write a date/time index to .csv (today noon is 42005.5 in the more common 1900 date system) and have the end user format that to suit themselves.
Related
I have a date 2020-01-30 (yyyy-MM-dd).
When I change the column format to Text it is getting converted to 43860.
I want to know how it is making it to 43860?
I came to know from Microsoft community that its a difference between 01-01-1900 to the written date. Then is should be 43858 . Why its 43860 ?
In Excel Date/Times are Doubles. It is the number of days since 1899-12-31. If you want to have text instead of a true date you will need to convert it by using the TEXT() Function on the worksheet or Format() in VBA.
There is an included error so that Excel could be compatible with Lotus 1-2-3. It assumes that 1900 was a leap year, which it was not. See: https://www.myonlinetraininghub.com/excel-date-and-time
=TEXT(A1,"yyyy-MM-dd")
Cited many times on SO. It's the number of days between Jan-1-1900 (or 1904) and the given date. This is what allows you to do math on dates.
https://support.microsoft.com/en-us/office/date-systems-in-excel-e7fe7167-48a9-4b96-bb53-5612a800b487
I have a CSV report that contains a date/time field, but when I open it in Excel, it seems to try and auto format the date and time, but has some issues with certain dates.
If I open the CSV file in Notepad, all of the dates follow the same format, which is something like 2/1/17 12:00 AM (M/D/Y). However I get 2 different results, depending on the date. If the day is less than 12, it will display in yyyy-MM-dd (for example: 2002-01-17 12:00:00 AM), which is my system date format. If the day is > 12, it will display as 10/31/16 12:00 AM, which is exactly how it is formatted in the CSV source. So, in those cases it looks like it is being treated as text.
If I change my short date format to M/d/y, then everything works fine, however I believe we have standardized on yyyy-MM-dd, and this will need to be used by multiple people, so changing the date format for any users who need to use this spreadsheet isn't a great option.
Ideally, what I would like to do is prevent this from happening altogether, if possible by not having the dates be automatically formatted when the document is opened. Is that possible?
As the title asks, I want to format today's date into mmddyy ina variable for a macro to make saving a file easier. So since today's date is August 14, 2015 I want the variable to read 081415.
VBA equivalent is format. See here.
=Format(Date,"mmddyy")
You should also consider being vary careful when handling dates depending on your location.
A constant problem I had in the UK was excel trying to as usual help and insisting on interpreting some dates as US.
For example
1st August 2015 you would expect 010815 in the UK.
However excel would regularly give 080115 formatting as though it was US.
To be completely sure of the correct date, you should be explicit with the date eg.
format(dateserial(year(now()),month(now()),day(now())),"mmddyy")
I have collected some details from sql and it shows a birthdates as following (each line represents a different birthdate):
-294022800
649119600
-138675600
49158000
32396400
631152000
-2147483648
731894400
-408067200
522025200
I was trying to change them in excel using this formula:
=DATE(INT(A1/10000),INT((A1-10000*INT(A1/10000))/100),A1-(100*INT(A1/100)))
But it didnt work well, it must be in different format. Do you know what sort of format it is and how to convert it to date in excel? why some of numbers are negatives?
Can this be the EPOCH format? how to change it to normal human date in excel?
My guess would be that they are unix timestamps http://en.wikipedia.org/wiki/Unix_time
In excel, you can use something like:
=(((A1/60)/60)/24)+DATE(1970,1,1)
Although, you will have to watch out for the fact that your datetimes seem to include daylight savings offsets. (Some of them are multiples of a day (24*60*60), but others are an hour out). I'm not sure why you have a non-hour multiple in there (-2147483648), possibly some quirk of the original system.
Source: http://spreadsheetpage.com/index.php/tip/converting_unix_timestamps/
Unix timestamps can be converted with this formula
=A1/86400+DATE(1970,1,1)
The Unix timestamp is seconds since 1/1/1970 so birthdates before then would be negative. [one of the birthdates translates to 1901 - is that right? You'll have problems if any of the dates are before 1900 because Excel doesn't recognise those dates]
ok, I figured it out. This is the formula:
=(A1-(4*3600))/86400+25569
It seems that every week or so someone posts a question about dates being converted (corrupted?) to American format. Like many others, I have attempted to help but the problem is elusive. I now wonder if I have discovered the cause.
I am working on an application in which I need to extract data from an Excel worksheet and output it as strings formatted to match the value the Excel user can see. So if the value is “1” formatted to display as “1.00” then I want the string to be “1.00”.
I achieve this effect by testing the cell value to be a number, date or time. If it is, I retrieve the number format and use it to format the cell value so:
With .Cells(Row, Column)
Output string = Format(.Value, .NumberFormat)
End With
In most cases this gives me exactly the output I require. However, sometimes I get American dates and times when the source is formatted as a UK date or time.
After much experimentation with Excel 2003 and Excel 2007, I have discovered the cause. (I do not have access to Excel 2010 but from questions I deduce it has the same problem.) This question is in part intended to reveal this problem to the world because I can discover nothing on the internet to indicate that anyone else has noticed it. (No doubt someone will reply that they googled “xyz” and got the answer immediately.) However, the main purpose of this question is to seek suggestions for obtaining the result I need in all situations.
Typically I enter dates as, for example, “23mar12”. Excel recognises this as a date and formats it as “23-Mar-12”. I can select Format Cells and enter or select a custom format or select one of the date formats so I can have any format I can imagine wanting including non-English names for days and months.
However, in one case the format I select is not the format that is recorded: Custom format “dd/mm/yyyy” is recorded as Date format “* 14/03/2001”. This is not obviously a problem until further down the line.
I created a column of dates and times and formatted each with a different custom or standard format. I wrote a macro to extract the NumberFormat for each of these dates and times and write it as a string to an adjacent column. I also formatted the value using the number format and wrote that string to a third column.
In a number of cases the format selected and recorded by Excel was not the format returned by NumberFormat:
Excel format NumberFormat
Date: * 14/03/2001 m/d/yyyy
Date: * 14 March 2001 [$-F800]dddd, mmmm dd, yyyy
Date: 14/03/2001 dd/mm/yyyy;#
Date: 14/03/01 dd/mm/yy;#
Date: 14/3/01 d/m/yy;#
Date: 14.3.01 d.m.yy;#
Date: 2001-03-14 yyyy-mm-dd;#
Date: 14 March 2001 (1) [$-809]dd mmmm yyyy;#
Date: 14 March 2001 (2) [$-809]d mmmm yyyy;#
Custom: hh:mm:ss h:mm:ss
Time: * 13:30:55 [$-F400]h:mm:ss AM/PM
Time: 13:30:55 (1) hh:mm:ss;#
Time: 13:30:55 (2) h:mm:ss;#
Time: 01:30:55 PM [$-409]hh:mm:ss AM/PM;#
Time: 1:30:55 PM [$-409]h:mm:ss AM/PM;#
The values (1) and (2) in the Excel format column were added by me to indicate that there are two apparently identical formats. As can be seen from the NumberFormat column, in each case the second version suppresses a leading zero.
Most changes have no important effect. “[$-F800]” and so on are apparently dummy values with no effect. Apparently you can replace “F800” with an Microsoft country code to have the names of days and months translated to the language of that country.
However, the three standard formats that Microsoft marks with an asterisk are changed unacceptably. The dates are changed from little endian to middle endian; the time is changed from 24 hour to 12 hour and the day of the week has been added to “* 14 March 2001”.
The asterisk against the dates, references the comment: “Except for items that have an asterisk () in the Type list (Number tab, Format Cells dialog box), date formats that you apply do not switch date orders with the operating system.” The asterisk against the time, references the comment: “Except for items that have an asterisk () in the Type list (Number tab, Format Cells dialog box), time formats that you apply do not switch time orders with the operating system.”
If I have to, I can warn my users that standard date and time formats may not give the result desired. However, if they want the popular format “dd/mm/yyyy”, they cannot have it. “dd-mm-yyyy”, for example, is OK but custom format “dd/mm/yyyy” becomes date format “* 14/03/2001” becomes “m/d/yyyy”.
Returning to my opening point: is this strange handling of one particular date format the reason so many people claim their dates are sometimes being converted to American format and is this why the problem is so elusive? I have come across this type of problem elsewhere of one group of Microsoft programmers not knowing what another group are doing. Is this why some functions always work and other sometimes don’t? Some Microsoft programmers know where to look for the correct format and others don’t?
More importantly, for me, can anyone suggest:
How I obtain the true date or time format?
Some other way of determining the user’s chosen display format for a date or time?
BTW 1: I recall that thirty or so years ago I was told that the American military do not use month/day/year format; only American civilians use this format. Can anyone tell me if this is true?
BTW 2: The similar problem is with Excel colours. Excel holds its colours as "ggbbrr" while everybody else holds them as "rrggbb". The programmers for the .Net Excel inter-op were not told and and did not reverse the Excel colour number before using it to control the screen.
I have mainly come up against formatting and date issues when opening text files which have been saved with different regional settings. Two useful cell properties for dealing with this are:
.Text returns the cell value as it is displayed
.Value2 returns the unformatted cell value or date serial number.
As you say, standard date and number formats depend on windows regional settings and this may not be desired behavior as the same workbook can display differently in different regions. MS introduced the regional code prefixes in number formats (circa Excel 2000?) which enforce consistent display if needed but they need to be explicitly selected.
If you really want to see a date or number as the user entered it, you could extract the contents of the .xlsx file looking at the worksheet cell format and the shared strings xml definitions which list the number formats in the saved workbook. I don't really see a need to do this though as the underlying value is stored internally as a serial number and this will not change.
BTW 1: It's been almost 30 years since I was in the military...
I worked on helicopters and I was taught to use a format such as this in the aircraft logbooks: 3 Apr 12. So, that's how I still write dates. This way, there's no wondering about 4/3/2012 - is it April 3 or March 4?
I hacked this: I rewrite the original data in a known format. it relies on DateSerial and TimeSerial:
'Google spreadsheet stores dates in USA format (MM/DD/YYYY). We're in Australia, using DD/MM/YYYY, so we need to swap them.
'
With dc 'the cell who contains a date in USA format.
d = .Value 'capture value in USA format
t = TimeValue(d)
.NumberFormat = "dd/mm/yyyy" 'set to OZ format, so Excel knows the values were swapped in its internal math.
.Value = DateSerial(Year(d), Month(d), Day(d)) 'DateSerial takes y,d,m. We swap Month and Day components, to get OZ format dates
.Value = .Value + TimeSerial(Hour(t), Minute(t), Second(t))
dc.Font.Bold = True ' We bold the cells that are swapped, for debugging
End With
End If