Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 6 additions & 13 deletions src/fable-library-ts/Date.ts
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,9 @@ export function parseRaw(input: string): [Date, Offset] {
parseInt(timeParts[1] || "0", 10) * 60 +
parseFloat(timeParts[2] || "0");
if (m[3] != null && m[3].toUpperCase() === "PM" && hourPart < 12) {
timeInSeconds += 720;
timeInSeconds += 12 * 3600;
} else if (m[3] != null && m[3].toUpperCase() === "AM" && hourPart === 12) {
timeInSeconds -= 12 * 3600;
}
}
if (m[4] != null) { // There's an offset, parse as UTC
Expand Down Expand Up @@ -854,18 +856,9 @@ export function addYears(d: IDateTime, v: number) {
}

export function addMonths(d: IDateTime, v: number) {
let newMonth = month(d) + v;
let newMonth_ = 0;
let yearOffset = 0;
if (newMonth > 12) {
newMonth_ = newMonth % 12;
yearOffset = Math.floor(newMonth / 12);
newMonth = newMonth_;
} else if (newMonth < 1) {
newMonth_ = 12 + newMonth % 12;
yearOffset = Math.floor(newMonth / 12) + (newMonth_ === 12 ? -1 : 0);
newMonth = newMonth_;
}
const totalMonths = month(d) + v;
const newMonth = ((totalMonths - 1) % 12 + 12) % 12 + 1;
const yearOffset = Math.floor((totalMonths - 1) / 12);
const newYear = year(d) + yearOffset;
const _daysInMonth = daysInMonth(newYear, newMonth);
const newDay = Math.min(_daysInMonth, day(d));
Expand Down
26 changes: 9 additions & 17 deletions src/fable-library-ts/DateOffset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -249,28 +249,20 @@ export function addTicks(d: IDateTimeOffset, v: int64) {
}

export function addYears(d: IDateTimeOffset, v: number) {
const newMonth = d.getUTCMonth() + 1;
const newYear = d.getUTCFullYear() + v;
const d2 = new Date(d.getTime() + offset(d));
const newMonth = d2.getUTCMonth() + 1;
const newYear = d2.getUTCFullYear() + v;
const _daysInMonth = daysInMonth(newYear, newMonth);
const newDay = Math.min(_daysInMonth, d.getUTCDate());
return create(newYear, newMonth, newDay, d.getUTCHours(), d.getUTCMinutes(),
d.getUTCSeconds(), d.getUTCMilliseconds(), offset(d));
const newDay = Math.min(_daysInMonth, d2.getUTCDate());
return create(newYear, newMonth, newDay, d2.getUTCHours(), d2.getUTCMinutes(),
d2.getUTCSeconds(), d2.getUTCMilliseconds(), offset(d));
}

export function addMonths(d: IDateTimeOffset, v: number) {
const d2 = new Date(d.getTime() + offset(d));
let newMonth = d2.getUTCMonth() + 1 + v;
let newMonth_ = 0;
let yearOffset = 0;
if (newMonth > 12) {
newMonth_ = newMonth % 12;
yearOffset = Math.floor(newMonth / 12);
newMonth = newMonth_;
} else if (newMonth < 1) {
newMonth_ = 12 + newMonth % 12;
yearOffset = Math.floor(newMonth / 12) + (newMonth_ === 12 ? -1 : 0);
newMonth = newMonth_;
}
const totalMonths = d2.getUTCMonth() + 1 + v;
const newMonth = ((totalMonths - 1) % 12 + 12) % 12 + 1;
const yearOffset = Math.floor((totalMonths - 1) / 12);
const newYear = d2.getUTCFullYear() + yearOffset;
const _daysInMonth = daysInMonth(newYear, newMonth);
const newDay = Math.min(_daysInMonth, d2.getUTCDate());
Expand Down
14 changes: 14 additions & 0 deletions tests/Js/Main/DateTimeOffsetTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,20 @@
test -20 2050
test -100 2046

testCase "DateTimeOffset.AddMonths keeps last day when delta is a multiple of 12" <| fun () ->
let dt = DateTimeOffset(2020, 12, 31, 0, 0, 0, TimeSpan.Zero).AddMonths(12)
dt.Year |> equal 2021
dt.Month |> equal 12
dt.Day |> equal 31

testCase "DateTimeOffset.AddYears keeps offset-local wall clock" <| fun () ->
let dt = DateTimeOffset(2020, 1, 1, 2, 0, 0, TimeSpan.FromHours 5.).AddYears(1)
dt.Year |> equal 2021
dt.Month |> equal 1
dt.Day |> equal 1
dt.Hour |> equal 2
dt.Offset |> equal (TimeSpan.FromHours 5.)

testCase "DateTimeOffset.AddDays works" <| fun () ->
let test v expected =
let dt = DateTimeOffset(2014,9,12,0,0,0,TimeSpan.Zero).AddDays(v)
Expand Down Expand Up @@ -888,7 +902,7 @@

testCase "Implicit conversion from DateTime preserves value" <| fun () ->
let d = DateTime(2024, 1, 15, 0, 0, 0, DateTimeKind.Utc)
let dto: DateTimeOffset = d

Check warning on line 905 in tests/Js/Main/DateTimeOffsetTests.fs

View workflow job for this annotation

GitHub Actions / build-javascript (ubuntu-latest)

This expression uses the implicit conversion 'DateTimeOffset.op_Implicit(dateTime: DateTime) : DateTimeOffset' to convert type 'DateTime' to type 'DateTimeOffset'. See https://aka.ms/fsharp-implicit-convs. This warning may be disabled using '#nowarn "3391".

Check warning on line 905 in tests/Js/Main/DateTimeOffsetTests.fs

View workflow job for this annotation

GitHub Actions / build-javascript (windows-latest)

This expression uses the implicit conversion 'DateTimeOffset.op_Implicit(dateTime: DateTime) : DateTimeOffset' to convert type 'DateTime' to type 'DateTimeOffset'. See https://aka.ms/fsharp-implicit-convs. This warning may be disabled using '#nowarn "3391".
dto.UtcDateTime |> equal d
]
]
19 changes: 19 additions & 0 deletions tests/Js/Main/DateTimeTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,19 @@ let tests =
d3.Hour + d3.Minute + d3.Second |> equal 54


testCase "DateTime.Parse handles AM/PM designator correctly" <| fun () ->
// Time-only strings parse to clock fields that are timezone-independent
let d = DateTime.Parse("1:05:34 PM", CultureInfo.InvariantCulture)
d.Hour |> equal 13
d.Minute |> equal 5
d.Second |> equal 34
let d = DateTime.Parse("12:05 AM", CultureInfo.InvariantCulture)
d.Hour |> equal 0
d.Minute |> equal 5
let d = DateTime.Parse("12:05 PM", CultureInfo.InvariantCulture)
d.Hour |> equal 12
d.Minute |> equal 5

testCase "DateTime.TryParse works" <| fun () ->
let (isSuccess, _) = DateTime.TryParse("foo", CultureInfo.InvariantCulture, DateTimeStyles.None)
isSuccess |> equal false
Expand Down Expand Up @@ -1005,6 +1018,12 @@ let tests =
test -20 2050
test -100 2046

testCase "DateTime.AddMonths keeps last day when delta is a multiple of 12" <| fun () ->
let dt = DateTime(2020, 12, 31, 0, 0, 0, DateTimeKind.Utc).AddMonths(12)
dt.Year |> equal 2021
dt.Month |> equal 12
dt.Day |> equal 31

testCase "DateTime.AddDays works" <| fun () ->
let test v expected =
let dt = DateTime(2014,9,12,0,0,0,DateTimeKind.Utc).AddDays(v)
Expand Down
Loading