如何在应用中将时间与当前时间同步? (WindowsPhone,C#)

时间:2016-04-01 11:53:29

标签: c# windows-phone-8.1

我正在为Windows Phone 8.1开发一款应用。应用程序中的时间必须与当前时间大致完全同步。假设服务器与此exact time同步。那么如何让我的应用与服务器保持同一时间?我不想打扰用户设置手机时间或更改手机时间。

我拥有的是Int32 unixTimestamp

C#

Int32 unixTimestamp = 
    (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

此时间戳例如1459500000,但服务器提供1459500030。 我是否必须上网并在那里获得时间,或者在应用程序本身中有更好的解决方案吗?

所有帮助表示赞赏。

请注意,我正在开发时手机和服务器处于同一时区,但如果可能的话,我想立刻为所有时区做这个技巧。当我在另一个时区时,这个时间戳会改变吗?正如@Sharp所说,unixtimestamp在所有时区都是相同的

2 个答案:

答案 0 :(得分:1)

这里有一些可以帮助你的代码,但它不在C#中。

/**
 * Converts the given <code>date</code> from the <code>fromTimeZone</code> to the
 * <code>toTimeZone</code>.  Since java.util.Date has does not really store time zome
 * information, this actually converts the date to the date that it would be in the
 * other time zone.
 *
 * @param date
 * @param fromTimeZone
 * @param toTimeZone
 * @return
 */
public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone) {
    long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone);
    long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone);

    return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset));
}

/**
 * Calculates the offset of the <code>timeZone</code> from UTC, factoring in any
 * additional offset due to the time zone being in daylight savings time as of
 * the given <code>date</code>.
 *
 * @param date
 * @param timeZone
 * @return
 */
private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone) {
    long timeZoneDSTOffset = 0;
    if (timeZone.inDaylightTime(date)) {
        timeZoneDSTOffset = timeZone.getDSTSavings();
    }

    return timeZone.getRawOffset() + timeZoneDSTOffset;
}

以下是如何使用它的示例:

/**
 *The method to set the start of the <i>Estimated Delivery Time</i> window<br>
 * Internally calls {@link #updateRedzoneDrawable}
 * @param startTime the start of the EstimatedDeliveryTime window
 */
public void setEstimatedDeliveryTimeFrom(Date startTime) {
    Log.d(LOGTAG, "---> setEstimatedDeliveryTimeFrom(" + startTime + ")");
    Log.d(LOGTAG, "startTime = " + startTime + "\tstartTime.getHours() = " + startTime.getHours() + ", startTime.getMinutes() = " + startTime.getMinutes());
    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss Z");
    formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
    Log.d(LOGTAG, "formatted startTime = " + formatter.format(startTime));

    Date newStartTime = convertTimeZone(startTime, TimeZone.getDefault(), TimeZone.getTimeZone("UTC"));
    Log.d(LOGTAG, "expectedDelivery_start = newStartTime (" + newStartTime + ")");
    expectedDelivery_start = newStartTime;

    updateRedzoneDrawable();
}

我希望你们不要因为在C#线程中发布Java代码而将我推向无限,但我这样做是为了帮助你,因为Date只使用Unix时间戳。

答案 1 :(得分:0)

听起来您需要API调用来查询服务器的时间(您需要根据延迟做出一些假设),并将其与当地时间进行比较。

您已经说过,您不想将手机的内部时钟设置为匹配,因此您唯一的另一个选择是使用服务器时间和手机之间的差异进行比较&# 39;内部时钟用于以后的查询(例如,如果您需要同步时钟来协助验证)。您可以在其中一个类上使用静态成员返回服务器的日期时间版本,而不是在整个代码中使用container.addItem(customId)