java - 需要帮助破译 http 请求中基于 java 的时间格式

标签 java javascript timestamp

我在向页面发送 http 请求时遇到问题。从我在网站上填写的表格传输的数据,我无法解密。 时间和日期用 7 个符号进行编码。这里有大写、小写字母、数字和一些特殊字符,例如下划线。

字符串是连续的,当我有一分钟的时间可以更改最后 3 个字符时。但例如,数字2尚未存入相同的字母等。

很抱歉我没有例子。我只是在家,我想要访问的服务器在我的工作上。

来自德国的许多问候,并非常感谢您的帮助!

以下是示例。

URK4AgA 时间为 2014 年 2 月 19 日 17:00
URAk1AA 时间为 2014 年 2 月 17 日 17:00
URKOzyA 时间为 2014 年 2 月 19 日 14:00
UGDVrYA 时间为 2013 年 10 月 4 日 14:00

抱歉我的英语不好......

最佳答案

这是自 Unix epoch 以来以 64 为基数的毫秒单位计数。让它更令人困惑的是(1)你的例子中的时间与那个时间有一个小时的偏移,我假设是德国时间; (2) 其中一个年份错误(2012年应该是2013年); (3) 其中之一也有夏令时。除此之外,它确实有效。

最常见的 64 位字母表使用 A-Za-z0-9 以及 +/。但是,您说某些时间戳包含下划线,因此我假设它是使用 -_ 作为最后两个字符的变体 Base 64 字母表。但还有其他变体,因此如果没有更多示例,就不可能确定字母表。

您还没有说明您实际使用的是哪种语言,但这里有用于编码和解码这些时间戳的 Java 方法,这些方法将它们与 Java Date 对象相互转换。 (如果需要,您可以轻松地将其更改为使用纯整数时间戳。)

private static final String timestampAlphabet =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";

public static String encodeTimestamp(Date date) {
    long t = date.getTime();
    StringBuilder timestamp = new StringBuilder();
    do {
        timestamp.append(timestampAlphabet.charAt((int)(t % 64)));
    } while ((t /= 64) != 0);
    return timestamp.reverse().toString();
}

public static Date decodeTimestamp(String timestamp) {
    long t = 0;
    for (char c : timestamp.toCharArray()) {
        t = t * 64 + timestampAlphabet.indexOf(c);
    }
    return new Date(t);
}

以下是 JavaScript 中的相同函数,它们与 JavaScript Date 对象相互转换:

var timestampAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";

function encodeTimestamp(date) {
    var t = date.getTime();
    var timestamp = "";
    do {
        timestamp = timestampAlphabet[t % 64] + timestamp;
    } while (t = Math.floor(t / 64));
    return timestamp;
}

function decodeTimestamp(timestamp) {
    var t = 0;
    for (var i = 0; i < timestamp.length; i++) {
        t = t * 64 + timestampAlphabet.indexOf(timestamp.charAt(i));
    }
    return new Date(t);
}

编辑:这是 VBA。别再打扰我了。

Private Const TimestampAlphabet As String = _
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"

Public Static Function EncodeTimestamp(ByVal d As Date) As String
    Dim t As Variant
    t = (CDec(d) - 25569) * 86400000
    Do
        EncodeTimestamp = Mid(TimestampAlphabet, 1 + t - (64 * Fix(t / 64)), 1) + EncodeTimestamp
        t = Fix(t / 64)
    Loop While t > 0
End Function

Public Static Function DecodeTimestamp(ByVal timestamp As String) As Date
    Dim t As Variant, i As Integer
    t = CDec(0)
    For i = 1 To Len(timestamp)
        t = t * 64 + InStr(TimestampAlphabet, Mid(timestamp, i, 1)) - 1
    Next
    DecodeTimestamp = CDate(CDbl((t / 86400000) + 25569))
End Function

关于java - 需要帮助破译 http 请求中基于 java 的时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21872968/

相关文章:

mysql 获取小时/分钟/秒的总和

java - 使用 sql2o 在关闭连接之前执行更多查询

java - 部署java servlets : how to atomatically do the .类文件复制并重启tomcat

javascript - WebGL 被检测为支持,但实际上并不支持

mysql - 获取当月记录

php - 如何选择具有时间戳范围的记录?

java - 禁用按钮一段时间

java - 无效数据访问ApiUsageException : detached entity passed to persist

javascript - 无法读取未定义的属性长度 - AngularJS

javascript - 在 TypeScript 中调用 NPM 模块的 JS 函数