diff --git a/webclient/package.json b/webclient/package.json
index 6d69b2d..83e7c31 100644
--- a/webclient/package.json
+++ b/webclient/package.json
@@ -7,6 +7,7 @@
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"moment": "^2.24.0",
+ "moment-timezone": "^0.5.28",
"react": "^16.12.0",
"react-datetime": "^2.16.3",
"react-dom": "^16.12.0",
diff --git a/webclient/src/Classes.js b/webclient/src/Classes.js
index 0100e0f..235a33d 100644
--- a/webclient/src/Classes.js
+++ b/webclient/src/Classes.js
@@ -2,7 +2,7 @@ import React, { useState, useEffect, useReducer } from 'react';
import { BrowserRouter as Router, Switch, Route, Link, useParams } from 'react-router-dom';
import './light.css';
import { Button, Container, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
-import moment from 'moment';
+import moment from 'moment-timezone';
import { isAdmin, isInstructor, BasicTable, requester } from './utils.js';
import { NotFound, PleaseLogin } from './Misc.js';
import { InstructorClassDetail, InstructorClassAttendance } from './InstructorClasses.js';
@@ -31,10 +31,10 @@ function ClassTable(props) {
{x.course_name}
- {moment.utc(x.datetime).local().format('ll')}
+ {moment.utc(x.datetime).tz('America/Edmonton').format('ll')}
- {x.is_cancelled ? 'Cancelled' : moment.utc(x.datetime).local().format('LT')}
+ {x.is_cancelled ? 'Cancelled' : moment.utc(x.datetime).tz('America/Edmonton').format('LT')}
{x.instructor_name}
{x.cost === '0.00' ? 'Free' : '$'+x.cost}
{x.student_count} {!!x.max_students && '/ '+x.max_students}
@@ -160,13 +160,13 @@ export function ClassDetail(props) {
Date:
- {moment.utc(clazz.datetime).local().format('ll')}
+ {moment.utc(clazz.datetime).tz('America/Edmonton').format('ll')}
Time:
- {clazz.is_cancelled ? 'Cancelled' : moment.utc(clazz.datetime).local().format('LT')}
+ {clazz.is_cancelled ? 'Cancelled' : moment.utc(clazz.datetime).tz('America/Edmonton').format('LT')}
diff --git a/webclient/src/Courses.js b/webclient/src/Courses.js
index 8609533..f298383 100644
--- a/webclient/src/Courses.js
+++ b/webclient/src/Courses.js
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Switch, Route, Link, useParams } from 'react-router-dom';
import './light.css';
import { Container, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
-import moment from 'moment';
+import moment from 'moment-timezone';
import { isInstructor, requester } from './utils.js';
import { NotFound, PleaseLogin } from './Misc.js';
import { InstructorCourseList, InstructorCourseDetail } from './InstructorCourses.js';
@@ -122,10 +122,10 @@ export function CourseDetail(props) {
- {moment.utc(x.datetime).local().format('ll')}
+ {moment.utc(x.datetime).tz('America/Edmonton').format('ll')}
- {x.is_cancelled ? 'Cancelled' : moment.utc(x.datetime).local().format('LT')}
+ {x.is_cancelled ? 'Cancelled' : moment.utc(x.datetime).tz('America/Edmonton').format('LT')}
{x.instructor_name}
{x.cost === '0.00' ? 'Free' : '$'+x.cost}
diff --git a/webclient/src/Home.js b/webclient/src/Home.js
index d61b571..21e650d 100644
--- a/webclient/src/Home.js
+++ b/webclient/src/Home.js
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Switch, Route, Link, useParams } from 'react-router-dom';
-import moment from 'moment';
+import moment from 'moment-timezone';
import './light.css';
import { Container, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
import { statusColor, BasicTable, staticUrl, requester } from './utils.js';
@@ -141,7 +141,7 @@ export function Home(props) {
}, []);
const getStat = (x) => stats && stats[x] ? stats[x] : '?';
- const getDateStat = (x) => stats && stats[x] ? moment.utc(stats[x]).local().format('ll') : '?';
+ const getDateStat = (x) => stats && stats[x] ? moment.utc(stats[x]).tz('America/Edmonton').format('ll') : '?';
return (
diff --git a/webclient/src/InstructorClasses.js b/webclient/src/InstructorClasses.js
index 27f5d0b..c6b3670 100644
--- a/webclient/src/InstructorClasses.js
+++ b/webclient/src/InstructorClasses.js
@@ -3,7 +3,7 @@ import { BrowserRouter as Router, Switch, Route, Link, useParams, useHistory } f
import ReactToPrint from 'react-to-print';
import * as Datetime from 'react-datetime';
import 'react-datetime/css/react-datetime.css';
-import moment from 'moment';
+import moment from 'moment-timezone';
import './light.css';
import { Button, Container, Checkbox, Divider, Dropdown, Form, Grid, Header, Icon, Image, Label, Menu, Message, Segment, Table } from 'semantic-ui-react';
import { BasicTable, staticUrl, requester } from './utils.js';
@@ -18,7 +18,7 @@ class AttendanceSheet extends React.Component {
{clazz.course_name} Attendance
- {moment.utc(clazz.datetime).local().format('llll')}
+ {moment.utc(clazz.datetime).tz('America/Edmonton').format('llll')}
{num >= 2 ? ', '+num+' students sorted by registration time.' : '.'}
@@ -241,7 +241,7 @@ function InstructorClassEditor(props) {
{error.datetime &&
diff --git a/webclient/yarn.lock b/webclient/yarn.lock
index 828b2c4..8263330 100644
--- a/webclient/yarn.lock
+++ b/webclient/yarn.lock
@@ -6682,7 +6682,14 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
dependencies:
minimist "0.0.8"
-moment@^2.24.0:
+moment-timezone@^0.5.28:
+ version "0.5.28"
+ resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338"
+ integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==
+ dependencies:
+ moment ">= 2.9.0"
+
+"moment@>= 2.9.0", moment@^2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==