Anzeigen von Daten in der Zeitzone des Benutzers
1. Überblick
In dieser Rate vonthe Reddit app case study werden wir die bescheduling post’s according to the user’s timezone hinzufügen.
Der Umgang mit Zeitzonen ist notorisch schwierig und die technischen Möglichkeiten sind weitreichend. Unser erstes Anliegen ist, dass wir dem Benutzer Daten entsprechend ihrer eigenen (konfigurierbaren) Zeitzone anzeigen müssen. Wir müssen auchwhat format the date will be saved as, in the database entscheiden.
2. Eine neue Benutzereinstellung -timezone
Zunächst fügen wir unseren bereits vorhandenen Einstellungen ein neues Feld hinzu -timezone:
@Entity
public class Preference {
...
private String timezone;
}
Wir dann einfachmake the timezone configurable in the user Preferences Page - nutzen eine einfache, aber sehr nützliche JQueryplugin:
Beachten Sie, dass die Standardzeitzone die Serverzeitzone ist -which runs on UTC.
3. Der Controller
Nun zum spaßigen Teil. Wir müssen Daten vonuser’s timezone inserver’s timezone konvertieren:
@Controller
@RequestMapping(value = "/api/scheduledPosts")
public class ScheduledPostRestController {
private static final SimpleDateFormat dateFormat =
new SimpleDateFormat("yyyy-MM-dd HH:mm");
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public void schedule(
@RequestBody Post post,
@RequestParam(value = "date") String date) throws ParseException
{
post.setSubmissionDate(
calculateSubmissionDate(date, getCurrentUser().getPreference().getTimezone()));
...
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void updatePost(
@RequestBody Post post,
@RequestParam(value = "date") String date) throws ParseException
{
post.setSubmissionDate(
calculateSubmissionDate(date, getCurrentUser().getPreference().getTimezone()));
...
}
private synchronized Date calculateSubmissionDate(String dateString, String userTimeZone)
throws ParseException {
dateFormat.setTimeZone(TimeZone.getTimeZone(userTimeZone));
return dateFormat.parse(dateString);
}
}
Die Konvertierung ist recht unkompliziert. Beachten Sie jedoch, dass sie nur bei Schreibvorgängen ausgeführt wird. Der Server gibt weiterhin UTC für Lesevorgänge zurück.
Das ist für unseren Kunden vollkommen in Ordnung, da wir die Konvertierung in JS durchführen - aber es lohnt sich zu verstehen, dassfor read operations, the server still returns UTC dates.
4. Das Frontend
Lassen Sie uns nun sehen, wie Sie die Zeitzone des Benutzers im Front-End verwenden:
4.1. Zeigen Sie die Beiträge an
Wir müssen diesubmissionDatedes Posts anhand der Zeitzone des Benutzers anzeigen:
Post title
Submission Date
(UTC)
Und hier ist unsere FunktionloadPage():
function loadPage(page){
...
$('.table').append(''+post.title+' '+
convertDate(post.submissionDate)+' ');
...
}
function convertDate(date){
var serverTimezone = [[dates.format(#calendars.createToday(), 'z')}]];
var serverDate = moment.tz(date, serverTimezone);
var clientDate = serverDate.clone().tz($("#timezone").html());
var myformat = "YYYY-MM-DD HH:mm";
return clientDate.format(myformat);
}
Moment.js hilft hier bei der Zeitzonenumrechnung.
4.2. Planen Sie einen neuen Beitrag
Wir müssen auch unsereschedulePostForm.html ändern:
Submission Date (UTC)
Schließlich müssen wir auch unsereeditPostForm.html ändern, um den alten Wert vonsubmissonDatezu lokalisieren:
$(function() {
var serverTimezone = [[dates.format(#calendars.createToday(), 'z')}]];
var serverDate = moment.tz($("#date").val(), serverTimezone);
var clientDate = serverDate.clone().tz($("#timezone").html());
var myformat = "YYYY-MM-DD HH:mm";
$("#date").val(clientDate.format(myformat));
});
5. Fazit
In diesem einfachen Artikel haben wir ein einfaches, aber äußerst nützliches Feature in die Reddit-App aufgenommen - die Möglichkeit, alles gemäß Ihrer eigenen Zeitzone anzuzeigen.
Dies warone of the main pain points as I was using the app - die Tatsache, dass alles in UTC war. Jetzt - alle Daten werden korrekt in der Zeitzone des Benutzers angezeigt, so wie sie sein sollten.